Benötigen Sie eines von zwei Argumenten mit argparse

182

Gegeben:

import argparse

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

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

wie mache ich

  • machen mindestens eine von „foo, bar“ mandatory: --foo x, --bar yund --foo x --bar ysind in Ordnung
  • machen höchstens eine von "foo, bar" obligatorisch: --foo xoder --bar ysind in ordnung, --foo x --bar yist nicht
georg
quelle

Antworten:

295

Ich denke, Sie suchen nach so etwas wie gegenseitigem Ausschluss (zumindest für den zweiten Teil Ihrer Frage).

Auf diese Weise wird nur foo oder bar akzeptiert, nicht beide.

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

Übrigens, ich habe gerade eine andere Frage gefunden , die sich auf dieselbe Art von Problem bezieht.

Hoffe das hilft

jlengrand
quelle
1
Ich hätte nie gedacht, dass es so einfach ist! Ich liebe dich Python 3.6!
bjd2385
Wer ist Christian Witts und wo ist seine Antwort?
Ijoseph
3
Hey @ijoseph, diese Antwort ist mittlerweile ziemlich alt. Ich bin mir nicht mehr sicher, wie die Antwort lautete. Es wurde wahrscheinlich inzwischen entfernt. Das tut mir leid!
Jlengrand
1
@jlengrand Ihre Antwort hat immer noch für mich funktioniert, nachdem mir klar wurde, dass sie tatsächlich beide in der Frage vorgeschlagenen Bedingungen löst ( XORim Grunde genommen). Meine anfängliche Sorge war, dass Ihre nur eine der beiden Bedingungen gelöst hat.
Ijoseph
Danke für die Rückmeldung. Ich hatte eine Idee, dass es tatsächlich alles lösen würde, war mir aber nicht mehr sicher: D. Ich werde die Antwort entsprechend bearbeiten!
Jlengrand
39

Wenn Sie eine Prüfung benötigen, die nicht vom Modul bereitgestellt wird, können Sie dies jederzeit manuell tun:

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