Модуль argparse Як додати параметр без аргументу?


165

Я створив сценарій за допомогою argparse.

Сценарій повинен брати назву файла конфігурації як опцію, і користувач може вказати, чи потрібно їм повністю виконувати сценарій або лише моделювати його.

Аргументи для передачі: ./script -f config_file -sабо ./script -f config_file.

Для частини -f config_file це нормально, але він постійно запитує у мене аргументи для -s, який є опціональним, і жоден за ним не повинен дотримуватися.

Я спробував це:

parser = argparse.ArgumentParser()
parser.add_argument('-f', '--file')
#parser.add_argument('-s', '--simulate', nargs = '0')
args = parser.parse_args()
if args.file:
    config_file = args.file
if args.set_in_prod:
        simulate = True
else:
    pass

З такими помилками:

File "/usr/local/lib/python2.6/dist-packages/argparse.py", line 2169, in _get_nargs_pattern
nargs_pattern = '(-*%s-*)' % '-*'.join('A' * nargs)
TypeError: can't multiply sequence by non-int of type 'str'

І те саме помилка з ''замість 0.

Відповіді:


233

Як @Felix Kling запропонував використовувати action='store_true':

>>> from argparse import ArgumentParser
>>> p = ArgumentParser()
>>> _ = p.add_argument('-f', '--foo', action='store_true')
>>> args = p.parse_args()
>>> args.foo
False
>>> args = p.parse_args(['-f'])
>>> args.foo
True

97

Щоб створити параметр, який не потребує значення, встановіть action [docs] його значення на 'store_const', 'store_true'або 'store_false'.

Приклад:

parser.add_argument('-s', '--simulate', action='store_true')

Привіт; Дякую за вашу відповідь. Я спробував, як пояснено в документі: >>> parser.add_argument ('- foo', '-f', action = 'store_true') _StoreTrueAction (option_strings = ['- foo', '-f'], dest = 'foo', nargs = 0, const = True, за замовчуванням = False, type = Ні, вибір = None, help = None, metavar = None) >>> parser.parse_args () Простір імен (foo = False) >> > print args.foo Traceback (останній виклик останній): Файл "<stdin>", рядок 1, в <module> AttributeError: "Об'єкт простору імен" не має атрибута "foo" >>> `Це, здається, не працює; Я не знаю, як отримати значення після призначення. Дякуємо, що допомогли мені!
Філіпп

@philippe: ви забули прив'язки parser.parse_args()повертається для args stackoverflow.com/questions/5262702 / ...
JFS

@philippe: args = parser.parse_args()як у вас уже є код. Вам просто потрібно замінити коментований рядок, і тоді ви можете отримати доступ до значення args.simulate.
Фелікс Клінг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.