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')