Wymagaj jednego z dwóch argumentów przy użyciu argparse

183

Dany:

import argparse

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

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

Jak ja

  • Wykonaj co najmniej jedną z „foo bar” obowiązkowe: --foo x, --bar yi --foo x --bar ysą w porządku
  • ustaw co najwyżej jedno z „foo, bar” obowiązkowe: --foo xlub --bar ysą w porządku, --foo x --bar ynie jest
Georg
źródło

Odpowiedzi:

297

Myślę, że szukasz czegoś w rodzaju wzajemnego wykluczenia (przynajmniej w drugiej części pytania).

W ten sposób akceptowane będą tylko foo lub bar, a nie oba.

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

BTW, właśnie znalazłem inne pytanie dotyczące tego samego rodzaju problemu.

Mam nadzieję że to pomoże

jlengrand
źródło
1
Nigdy bym nie pomyślał, że to takie proste! Love you Python 3.6!
bjd2385 30.04.17
Kim jest Christian Witts i gdzie jest jego odpowiedź?
ijoseph
3
Hej @ijoseph, ta odpowiedź jest już ładna. Nie jestem już pewien, jaka była odpowiedź. Prawdopodobnie został już usunięty. Przepraszam za to!
jlengrand
1
@jlengrand twoja odpowiedź wciąż działała dla mnie po tym, jak zdałem sobie sprawę, że faktycznie rozwiązuje oba warunki zaproponowane w pytaniu ( XORw zasadzie). Początkowo martwiłem się, że twój rozwiązał tylko jeden z dwóch warunków.
ijoseph
Dziękujemy za opinię. Miałem pomysł, że to rzeczywiście wszystko rozwiązuje, ale nie byłem już pewien: D. Odpowiednio zmienię odpowiedź!
jlengrand
39

Jeśli potrzebujesz sprawdzenia, którego nie zapewnia moduł, zawsze możesz 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")
coś
źródło