Ich habe folgende Anforderungen:
./xyifier --prox --lport lport --rport rport
Für das Argument prox verwende ich action = 'store_true', um zu überprüfen, ob es vorhanden ist oder nicht. Ich benötige keines der Argumente. Aber wenn --prox gesetzt ist, benötige ich auch rport und lport. Gibt es eine einfache Möglichkeit, dies mit argparse zu tun, ohne eine benutzerdefinierte bedingte Codierung zu schreiben?
Mehr Code:
non_int.add_argument('--prox', action='store_true', help='Flag to turn on proxy')
non_int.add_argument('--lport', type=int, help='Listen Port.')
non_int.add_argument('--rport', type=int, help='Proxy port.')
Antworten:
Nein, es gibt in argparse keine Option, um sich gegenseitig einschließende Optionssätze zu erstellen .
Der einfachste Weg, damit umzugehen, wäre:
quelle
parser.error
Methode, das habe ich gesucht!if args.prox and (args.lport is None or args.rport is None):
args.lport is None
können Sie einfach verwendennot args.lport
. Ich denke, es ist etwas pythonischer.--lport
oder--rport
zu setzen0
, was eine gültige Eingabe für das Programm sein könnte.Sie sprechen von bedingt erforderlichen Argumenten. Wie @borntyping sagte, können Sie nach dem Fehler suchen und dies tun
parser.error()
, oder Sie können einfach eine Anforderung anwenden, die sich auf--prox
das Hinzufügen eines neuen Arguments bezieht .Eine einfache Lösung für Ihr Beispiel könnte sein:
Dieser Weg
required
empfängt entwederTrue
oderFalse
abhängig davon, ob der Benutzer verwendet wird--prox
. Dies garantiert auch, dass-lport
und-rport
ein unabhängiges Verhalten untereinander haben.quelle
ArgumentParser
dies zum Parsen von Argumenten aus einer anderen Liste als verwendet werdensys.argv
kann. In diesem Fall würde dies fehlschlagen.--prox=<value>
Syntax verwendet wird.Wie wäre es, wenn Sie die
parser.parse_known_args()
Methode verwenden und dann die Argumente--lport
und--rport
args nach Bedarf hinzufügen, falls--prox
vorhanden.Beachten Sie auch, dass Sie den
opts
nach dem ersten Parsen generierten Namespace angeben können, während Sie die verbleibenden Argumente beim zweiten Parsen analysieren. Auf diese Weise haben Sie am Ende nach Abschluss der Analyse einen einzigen Namespace mit allen Optionen.Nachteile:
--prox
nicht vorhanden, sind die beiden anderen abhängigen Optionen nicht einmal im Namespace vorhanden. Obwohl basierend auf Ihrem Anwendungsfall,--prox
ist das, was mit den anderen Optionen passiert, irrelevant , wenn es nicht vorhanden ist.--lport
und--rport
nicht in der Hilfemeldung angezeigt werdenquelle
Verwenden Sie,
lport
wennprox
nicht eingestellt ist. Wenn nicht, warum nicht machenlport
undrport
argumentierenprox
? z.BDas erspart Ihren Benutzern das Tippen. Es ist genauso einfach zu testen
if args.prox is not None:
wieif args.prox:
.quelle
a,b = args.prox
,a = args.prox[0]
usw.Die akzeptierte Antwort hat bei mir sehr gut funktioniert! Da der gesamte Code ohne Tests fehlerhaft ist, habe ich hier die akzeptierte Antwort getestet.
parser.error()
löst keinenargparse.ArgumentError
Fehler aus, sondern beendet den Prozess. Sie müssen testenSystemExit
.mit pytest
mit unittests
inspiriert von: Verwenden von unittest zum Testen von Argparse - Beenden von Fehlern
quelle