Python argparse взаимная эксклюзивная группа
39312 просмотра
3 ответа
Что мне нужно это:
pro [-a xxx | [-b yyy -c zzz]]
Я пробовал это, но не работает. Может ли кто-нибудь помочь мне?
group= parser.add_argument_group('Model 2')
group_ex = group.add_mutually_exclusive_group()
group_ex.add_argument("-a", type=str, action = "store", default = "", help="test")
group_ex_2 = group_ex.add_argument_group("option 2")
group_ex_2.add_argument("-b", type=str, action = "store", default = "", help="test")
group_ex_2.add_argument("-c", type=str, action = "store", default = "", help="test")
Спасибо!
Автор: Sean Источник Размещён: 12.11.2019 09:05Ответы (3)
91 плюса
add_mutually_exclusive_group
не делает всю группу взаимоисключающей. Это делает варианты внутри группы взаимоисключающими.
То, что вы ищете, это подкоманды . Вместо проги [-a xxxx | [-b yyy -c zzz]], у вас будет:
prog
command 1
-a: ...
command 2
-b: ...
-c: ...
Для вызова с первым набором аргументов:
prog command_1 -a xxxx
Для вызова со вторым набором аргументов:
prog command_2 -b yyyy -c zzzz
Вы также можете установить аргументы подкоманды как позиционные.
prog command_1 xxxx
Вроде как мерзавец или SVN:
git commit -am
git merge develop
Рабочий пример
# create the top-level parser
parser = argparse.ArgumentParser(prog='PROG')
parser.add_argument('--foo', action='store_true', help='help for foo arg.')
subparsers = parser.add_subparsers(help='help for subcommand')
# create the parser for the "command_1" command
parser_a = subparsers.add_parser('command_1', help='command_1 help')
parser_a.add_argument('a', type=str, help='help for bar, positional')
# create the parser for the "command_2" command
parser_b = subparsers.add_parser('command_2', help='help for command_2')
parser_b.add_argument('-b', type=str, help='help for b')
parser_b.add_argument('-c', type=str, action='store', default='', help='test')
Проверь это
>>> parser.print_help()
usage: PROG [-h] [--foo] {command_1,command_2} ...
positional arguments:
{command_1,command_2}
help for subcommand
command_1 command_1 help
command_2 help for command_2
optional arguments:
-h, --help show this help message and exit
--foo help for foo arg.
>>>
>>> parser.parse_args(['command_1', 'working'])
Namespace(a='working', foo=False)
>>> parser.parse_args(['command_1', 'wellness', '-b x'])
usage: PROG [-h] [--foo] {command_1,command_2} ...
PROG: error: unrecognized arguments: -b x
Удачи.
Автор: Jonathan Размещён: 28.07.2013 02:5926 плюса
Хотя ответ Джонатана отлично подходит для сложных вариантов, есть очень простое решение, которое будет работать для простых случаев, например, 1 вариант исключает 2 других варианта, как в
command [- a xxx | [ -b yyy | -c zzz ]]
или даже как в оригинальном вопросе:
pro [-a xxx | [-b yyy -c zzz]]
Вот как я бы это сделал:
parser = argparse.ArgumentParser()
# group 1
parser.add_argument("-q", "--query", help="query", required=False)
parser.add_argument("-f", "--fields", help="field names", required=False)
# group 2
parser.add_argument("-a", "--aggregation", help="aggregation",
required=False)
Я использую здесь параметры, предоставляемые оболочкой командной строки для запроса mongodb. collection
Экземпляр может либо вызвать метод aggregate
или метод find
с для дополнительных аргументов query
и fields
, следовательно , вы видите , почему первые два аргумента является совместимым и последним не является.
Итак, теперь я бегу parser.parse_args()
и проверяю его содержимое:
args = parser().parse_args()
print args.aggregation
if args.aggregation and (args.query or args.fields):
print "-a and -q|-f are mutually exclusive ..."
sys.exit(2)
Конечно, этот маленький хак работает только для простых случаев, и было бы страшно проверять все возможные варианты, если у вас много взаимоисключающих опций и групп. В этом случае вы должны разбить свои опции на группы команд, как предложил Джонатан.
Автор: Oz123 Размещён: 28.12.2014 10:384 плюса
Существует патч для Python (в разработке), который позволит вам сделать это.
http://bugs.python.org/issue10984
Идея состоит в том, чтобы позволить перекрывающимся взаимоисключающим группам. Так usage
может выглядеть так:
pro [-a xxx | -b yyy] [-a xxx | -c zzz]
Изменение кода argparse, чтобы вы могли создать две группы, как это было легко. Изменение usage
кода форматирования требует написания кастома HelpFormatter
.
В argparse
, действия группы не влияют на синтаксический анализ. Они просто help
инструмент форматирования. При этом help
взаимоисключающие группы влияют только на usage
линию. При разборе, то parser
использует взаимоисключающие группы для построения словаря потенциальных конфликтов ( a
не может произойти с b
или c
, b
не может произойти с a
, и т.д.), а затем выдает ошибку , если возникает конфликт.
Без этого argparse патча, я думаю , ваш лучший выбор , чтобы проверить пространство имен произведенных parse_args
самостоятельно (например , если оба a
и b
имеют нестандартные значения), а также повысить свою собственную ошибку. Вы даже можете использовать собственный механизм ошибок анализатора.
parser.error('custom error message')
Автор: hpaulj
Размещён: 30.07.2013 07:19
Вопросы из категории :
- python Обработка XML в Python
- python Как я могу использовать Python itertools.groupby ()?
- python Python: На какой ОС я работаю?
- python Как я могу создать непосредственно исполняемое кроссплатформенное приложение с графическим интерфейсом на Python?
- python Вызов функции модуля с использованием его имени (строки)
- python Звук Питона («Колокол»)
- python Regex и unicode
- python Создать зашифрованный ZIP-файл в Python
- python Создайте базовый итератор Python
- python Функция транспонирования / распаковки (обратная сторона zip)?
- argparse Зачем использовать argparse, а не optparse?
- argparse Подробный уровень с параметрами argparse и множеством -v
- argparse Подкоманда по умолчанию или обработка без подкоманды с помощью argparse
- argparse модуль argparse не работает в Python
- argparse Python argparse: укажите хотя бы один аргумент
- argparse Python argparse - добавить аргумент в несколько подпарсеров
- argparse type=dict in argparse.add_argument()
- argparse argparse store false, если не указано
- argparse аргумент аргумента argparse
- argparse В Python argparse возможно ли иметь парные --no-что-то / - что-то аргументы?