Python argparse: metavar и action=store_true вместе

Я использую модуль argparse в Python для анализа параметров, введенных в интерфейсе командной строки. У меня есть следующий вызов add_argument для объекта подпарсера:

submit_parser.add_argument('-pv','--provision',metavar='PROVISION', dest='PROVISION',
                                 help='provision system',
                                 action='store_true', default=False, required=False)

Я получаю эту ошибку:

Traceback (most recent call last):
  File "./scripts/tp4", line 94, in <module> 
    main()
  File "./scripts/tp4", line 74, in main 
    modloader.loadModules(sub_parsers)
  File "/usr/lib/python2.6/site-packages/tp4/cli/Moduleloader.py", line 66, in loadModules 
    registered_modules[module_name].setSubparserArgs(module_sub_parser)
  File "/usr/lib/python2.6/site-packages/tp4/cli/modules/AutotestModule.py", line 135, in setSubparserArgs
    action='store_true', default=False, required=False)
  File "/usr/share/tp4/cli/zip/argparse.zip/argparse.py", line 1302, in add_argument
    TypeError: __init__() got an unexpected keyword argument 'metavar'

Если я удалю параметры действия или метавара, это сработает. Почему оба не могут быть вместе? Об этом ограничении ничего нет в документации по argparse по адресу http://docs.python.org/dev/library/argparse. HTML.

Заранее благодарю за любую помощь


person Alan Evangelista    schedule 17.08.2012    source источник
comment
версия python.... важно проверить....   -  person avasal    schedule 17.08.2012
comment
Не то, чтобы вы спрашивали, но если action равно 'store_true', значение по умолчанию уже равно False (а если действие равно 'store_false', значение по умолчанию равно True). Это довольно удобно, хотя и отличается от optparse (где по умолчанию None в обоих случаях).   -  person torek    schedule 17.08.2012


Ответы (2)


Метавар имеет смысл только для позиционных аргументов (например, имена файлов в конце командной строки) или для случаев, когда аргумент принимает собственные аргументы (например, --input-files foo.txt bar.txt).

Ваш аргумент --provision является флагом, потому что вы установили action в store_true. Он не принимает никаких аргументов (т. е. nargs не задан). Таким образом, нет смысла иметь метавар.

Из документации argparse:

Когда ArgumentParser генерирует справочные сообщения, ему нужно каким-то образом сослаться на каждый ожидаемый аргумент. По умолчанию объекты ArgumentParser используют значение dest в качестве «имени» каждого объекта. По умолчанию для действий с позиционным аргументом целевое значение используется напрямую, а для дополнительных действий с аргументом целевое значение указывается в верхнем регистре. Таким образом, один позиционный аргумент с dest='bar' будет называться баром. Один необязательный аргумент --foo, за которым должен следовать один аргумент командной строки, будет называться FOO.

person pwc    schedule 17.08.2012
comment
Спасибо за объяснение. Однако эта информация не является явной в документации argparse. - person Alan Evangelista; 22.08.2012
comment
Для разреженных документов по Python я неизменно получаю ответы на веб-сайте PYMOTW, pymotw.com/2/argparse< /а> - person qneill; 18.09.2014
comment
Я использовал metavar=, когда на самом деле хотел dest=. - person aldo; 10.03.2015
comment
Я приземлился здесь дважды и повторю комментарий @aldo Use dest - person qneill; 02.06.2015

Чтобы получить ответ от @pwc, вам нужно использовать dest вместо metavar.

person asmeurer    schedule 04.06.2015