2012-06-22 2 views
98

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

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 не является
+0

возможного дубликат [Как закодировать argparse комбинационных вариант в питоне] (http://stackoverflow.com/questions/5603364/how-to-code-argparse-combinational-options-in-python) – robert

ответ

152

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

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

И вы действительно можете решить первую часть вопроса с ответом Кристиана Виттса. Объединив оба варианта, вы сможете достичь того, чего хотите.

BTW, только что нашел another question, ссылаясь на такой же выпуск.

Надеется, что это помогает

+0

Я никогда бы не подумал, что это так просто! Любите вас Python 3.6! – bjd2385

20

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

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") 
Смежные вопросы