2015-04-24 2 views
2
usage: [-h] [--foo FOO] bar 
  1. Как я могу убедиться, что значение FOO по умолчанию abc если я исполню мой сценарий, как показано ниже

./myscript.py --foo bar ->bar позиционно аргумент здесь. но args.foo рассматривает bar как аргумент '--foo'. Я хочу args.foo быть abc и bar быть позиционным аргументомпитон значение argparse по умолчанию для необязательного аргумента

ответ

3

Вы не можете, не переделывая свои аргументы.

Вы должны использовать два переключателя; один для включения поведения, и один для переопределения выбранного значения по умолчанию. Вы можете сделать второй переключатель следует, первый:

usage: [-h] [--foo] [--foo-setting FOO] bar 

где --foo является булево переключатель, который переключает поведение, и --foo-setting позволяет установить конфигурацию коммутатора:

parser.add_argument('--foo', action='store_true') 
parser.add_argument('--foo-setting', help='Set the value for foo, implies --foo is given') 

# ... 
args = parser.parse_args() 

if args.foo_setting is not None: 
    # default was overridden, explicitly enable the foo feature 
    args.foo = True 

if args.foo: 
    foo_feature_setting = args.foo_setting or 'default value' 
+0

Проблема в том, что я хочу добавить к взаимной эксклюзивной группе.Возможно ли иметь несколько вариантов в одном наборе группы? – tez

+0

@tez: no; но вы можете добавлять дополнительные тесты после разбора. Если был установлен параметр 'foo_setting', но был выбран другой вариант взаимоисключающей группы, то это ошибка, которую вы должны вручную обнаружить. –

1

Вы пробовали использовать --, чтобы отделить аргумент (0) --foo от bar?


С этой базовой установки:

p=argparse.ArgumentParser() 
p.add_argument('--foo',nargs='?',const='abc', default='other') 
p.add_argument('bar') 

In [633]: p.parse_args(['bar']) 
Out[633]: Namespace(bar='bar', foo='other') 

In [634]: p.parse_args(['bar','--foo']) 
Out[634]: Namespace(bar='bar', foo='abc') 

In [635]: p.parse_args(['bar','--foo','test']) 
Out[635]: Namespace(bar='bar', foo='test') 

In [636]: p.parse_args(['--foo','bar']) 
usage: ipython3 [-h] [--foo [FOO]] bar 
'error message' 

Равнина --foo может произойти после bar. 'other' ('default ) is the value it gets if absent, 'abc' (the const`) значение, которое он получает, если присутствует, но' empty '.

Но, как вы узнали, когда --foo является первым, он потребляет следующую строку, не оставляя ничего для аргумента positional. Другими словами, при обработке --foo он не учитывает будущие потребности bar.

Если добавить еще один аргумент

p.add_argument('--baz',action='store_true') 
p.parse_args(['--foo','--baz','bar']) 
# Namespace(bar='bar', baz=True, foo='abc') 

Это работает, потому что --baz отмечает конец --foo аргументов.

Вы также можете использовать --, чтобы отметить конец optionals и начало postionals:

p.parse_args(['--foo','--','bar']) 

Там является bug issue, который пытается исправить это путем резервирования строки для задней positionals http://bugs.python.org/issue9338argparse optionals with nargs='?', '*' or '+' can't be followed by positionals

Но патч не является тривиальным. -- - ваш лучший инструмент в это время.

Я не следую вашему комментарию Martijn о взаимоисключающих группах (ах).

Смежные вопросы