Вы пробовали использовать --
, чтобы отделить аргумент (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 о взаимоисключающих группах (ах).
Проблема в том, что я хочу добавить к взаимной эксклюзивной группе.Возможно ли иметь несколько вариантов в одном наборе группы? – tez
@tez: no; но вы можете добавлять дополнительные тесты после разбора. Если был установлен параметр 'foo_setting', но был выбран другой вариант взаимоисключающей группы, то это ошибка, которую вы должны вручную обнаружить. –