Python argparse - добавляет аргумент к нескольким подпарсерам

Мой скрипт определяет один основной парсер и несколько подпарсеров. Я хочу применить -p аргумент для некоторых подпарсеров. Пока код выглядит так:

parser = argparse.ArgumentParser(prog="myProg")
subparsers = parser.add_subparsers(title="actions")

parser.add_argument("-v", "--verbose",
                    action="store_true",
                    dest="VERBOSE",
                    help="run in verbose mode")

parser_create = subparsers.add_parser ("create", 
                                        help = "create the orbix environment")
parser_create.add_argument ("-p", 
                            type = int, 
                            required = True, 
                            help = "set db parameter")

# Update
parser_update = subparsers.add_parser ("update", 
                                        help = "update the orbix environment")
parser_update.add_argument ("-p", 
                            type = int, 
                            required = True, 
                            help = "set db parameter")

Как вы можете видеть add_arument ("-p") повторяется дважды. У меня на самом деле гораздо больше подпарсеров. Есть ли способ перебрать существующие подпапки, чтобы избежать повторения?

Для записи я использую Python 2.7

3 ответа

Решение

Это может быть достигнуто путем определения родительского синтаксического анализатора, содержащего общие опции:

[...]
parent_parser = argparse.ArgumentParser(add_help=False)
parent_parser.add_argument("-p", type=int, required=True,
                           help="set db parameter")
parser_create = subparsers.add_parser("create", parents=[parent_parser],
                                      help="create the orbix environment")
parser_update = subparsers.add_parser("update", parents=[parent_parser],
                                      help="update the orbix environment")

Принятый ответ правильный; правильный способ - использовать родительские парсеры. Однако пример кода IMO на самом деле не решил проблему. Позвольте мне добавить мои несколько центов, чтобы привести более подходящий пример.

Основное отличие от принятого ответа - явная возможность иметь некоторые аргументы корневого уровня (например, --verbose) а также разделяемые аргументы только для некоторых подпарасеров (-p только для create а также update подпарсеры но не для других)

# Same main parser as usual
parser = argparse.ArgumentParser()

# Usual arguments which are applicable for the whole script / top-level args
parser.add_argument('--verbose', help='Common top-level parameter',
                    action='store_true', required=False)

# Same subparsers as usual
subparsers = parser.add_subparsers(help='Desired action to perform', dest='action')

# Usual subparsers not using common options
parser_other = subparsers.add_parser("extra-action", help='Do something without db')

# Create parent subparser. Note `add_help=False` and creation via `argparse.`
parent_parser = argparse.ArgumentParser(add_help=False)
parent_parser.add_argument('-p', help='add db parameter', required=True)

# Subparsers based on parent

parser_create = subparsers.add_parser("create", parents=[parent_parser],
                                      help='Create something')
# Add some arguments exclusively for parser_create

parser_update = subparsers.add_parser("update", parents=[parent_parser],
                                      help='Update something')
# Add some arguments exclusively for parser_update 

Это справочное сообщение верхнего уровня (обратите внимание, что -p Параметр здесь не показан, это именно то, что вы ожидаете, потому что он специфичен для некоторых подпарсеров):

>>> parser.print_help()
usage: [-h] [--verbose] {extra-action,create,update} ...

positional arguments:
  {extra-action,create,update}
                        Desired action to perform
    extra-action        Do something without db
    create              Create something
    update              Update something

optional arguments:
  -h, --help            show this help message and exit
  --verbose             Common top-level parameter

И сообщение помощи для create действие:

>>> parser_create.print_help()
usage:  create [-h] -p P

optional arguments:
  -h, --help  show this help message and exit
  -p P        add db parameter

Вы также можете перебрать подпарсеры и добавить одну и ту же опцию ко всем из них.

parser = argparse.ArgumentParser(prog="myProg")
subparsers = parser.add_subparsers(title="actions")
parser.add_argument("-v", "--verbose",
                    action="store_true",
                    dest="VERBOSE",
                    help="run in verbose mode")

parser_create = subparsers.add_parser ("create", 
                                        help = "create the orbix environment")
parser_update = subparsers.add_parser ("update", 
                                        help = "update the orbix environment")

for subparser in [parser_create, parser_update]:
    subparser.add_argument ("-p", 
                            type = int, 
                            required = True, 
                            help = "set db parameter")

Вы можете зациклить на своих подпарсерах следующим образом.

for name, subp in subparsers.choices.items():
    print(subp)
    subp.add_argument(dest='g', help='Inpput for g variable', default='7')
Другие вопросы по тегам