2012-06-22 4 views
98

Dane:wymagać albo z dwoma argumentami za pomocą argparse

import argparse 

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

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

jak mam

  • Wykonaj co najmniej jedną z "foo bar" obowiązkowe: --foo x, --bar y i --foo x --bar y są w porządku
  • co najwyżej jeden z "foo, bar" obowiązkowy: --foo x lub --bar y są w porządku, --foo x --bar y nie jest
+0

możliwy duplikat [Jak zakodować argparse kombinacyjnych opcje w Pythonie] (http://stackoverflow.com/questions/5603364/how-to-code-argparse-combinational-options-in-python) – robert

Odpowiedz

152

Myślę, że szukasz czegoś takiego jak mutual exclusion (przynajmniej dla drugiej części twojego pytania). W ten sposób akceptowane będą tylko foo lub bar, a nie obie.

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

I rzeczywiście można rozwiązać pierwszą część pytania z odpowiedzią Christiana Wittsa. Łącząc oba, powinieneś być w stanie osiągnąć to, co chcesz.

BTW, właśnie znaleziono another question odnoszące się do tego samego rodzaju problemu.

Nadzieja to pomaga

+0

Nigdy bym nie przypuszczał, że to takie proste! Kocham cię Python 3.6! – bjd2385

20

Jeśli potrzebujesz czek, który nie został dostarczony przez moduł zawsze można to zrobić ręcznie:

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")