Требовать любой из двух аргументов, используя argparse

183

Дано:

import argparse

pa = argparse.ArgumentParser()
pa.add_argument('--foo')
pa.add_argument('--bar')

print pa.parse_args('--foo 1'.split())

как я

  • сделать по крайней мере один из «Foo, Bar» обязательным: --foo x, --bar yи --foo x --bar yвсе в порядке
  • сделать не более одного из "foo, bar" обязательным: --foo xили --bar yнормально, --foo x --bar yне
Georg
источник

Ответы:

297

Я думаю, что вы ищете что-то вроде взаимного исключения (по крайней мере, для второй части вашего вопроса).

Таким образом, будет принят только foo или bar, а не оба.

    import argparse

    parser = argparse.ArgumentParser()
    group = parser.add_mutually_exclusive_group(required=True)
    group.add_argument('--foo',action=.....)
    group.add_argument('--bar',action=.....)
    args = parser.parse_args()

Кстати, только что нашел другой вопрос, относящийся к той же проблеме.

Надеюсь это поможет

jlengrand
источник
1
Я бы никогда не догадался, что это так легко! Люблю тебя Питон 3.6!
bjd2385
Кто такой Кристиан Виттс и где его ответ?
Иосиф
3
Эй, @ijoseph, этот ответ к настоящему времени уже старый. Я не уверен, что ответ был больше. Это, вероятно, было удалено к настоящему времени. Простите за это!
Jlengrand
1
@jlengrand ваш ответ все еще работал для меня после того, как я понял, что он фактически решает оба условия, предложенные в вопросе (в XORосновном). Моя первоначальная забота заключалась в том, что вы решили только одно из двух условий.
Иосиф
Спасибо за ответ. У меня была идея, что это действительно все решает, но я больше не был уверен: D. Я отредактирую ответ соответственно!
Jlengrand
39

Если вам нужна проверка, которая не предусмотрена модулем, вы всегда можете сделать это вручную:

pa = argparse.ArgumentParser()
...
args = pa.parse_args()

if args.foo is None and args.bar is None:
   pa.error("at least one of --foo and --bar required")
STH
источник