Ich möchte prüfen, ob der Benutzer ein optionales Argument für argparse festgelegt hat oder nicht.
Kann ich mit isset sicher prüfen?
Etwas wie das:
if(isset(args.myArg)):
#do something
else:
#do something else
Funktioniert dies auch für Argumente vom Typ float / int / string?
Ich könnte einen Standardparameter festlegen und ihn überprüfen (z. B. myArg = -1 oder "" für einen String oder "NOT_SET"). Der Wert, den ich letztendlich verwenden möchte, wird jedoch erst später im Skript berechnet. Also würde ich es als Standard auf -1 setzen und es später auf etwas anderes aktualisieren. Dies scheint etwas ungeschickt im Vergleich zu der einfachen Überprüfung, ob der Wert vom Benutzer festgelegt wurde.
isset()
(Hinweis: Python ist kein PHP)? Meinten Siehasattr()
stattdessen vielleicht? Warum konfigurieren Sie argparse nicht so, dass stattdessen ein Standard für eine Option festgelegt wird?Antworten:
Ich denke, dass optionale Argumente (angegeben mit
--
) initialisiert werden,None
wenn sie nicht angegeben werden. So können Sie mit testenis not None
. Versuchen Sie das folgende Beispiel:quelle
default
Wert definiert.default
können Sie dennochnargs='?'
einenconst
Wert festlegen und angeben , wie in den Dokumenten beschrieben . Wenn das Argument fehlt,default
wird es verwendet, wenn das Argument ohne Wert angegeben wird,const
wird es verwendet, andernfalls wird der angegebene Wert verwendet. Mit nurdefault
undnargs='?'
, wirddefault
verwendet, wenn nicht gegeben,None
wenn w / o - Wert angegeben, andernfalls den angegebenen Wert.action= "store_true"
oderaction="store_const", const="yourconst"
nicht, um einen anderen Wert zu speichern. Dies funktioniert nicht, wenn Standardeinstellungen verwendet werden. In meinen eigenen habe ich alle Standardeinstellungen von argparser entfernt und alle in einer anderen Funktion behandelt,def defaults():
in der ich ConfigParser, ArgumentParser und Standardwerte in der gewünschten Reihenfolgeaction
. Die Antwort verwendet keinaction
. Es wird dokumentiert, dass sich die von Ihnen erwähnten Aktionen auf eine bestimmte Weise verhalten (wie Sie beobachtet haben). Es ist jedoch nicht erforderlich, eine Aktion zu definieren.Wie @Honza bemerkt,
is None
ist ein guter Test. Dies ist die Standardeinstellungdefault
, und der Benutzer kann Ihnen keine Zeichenfolge geben, die sie dupliziert.Sie können eine andere angeben
default='mydefaultvalue
und diese testen. Was aber, wenn der Benutzer diese Zeichenfolge angibt? Zählt das als Einstellung oder nicht?Sie können auch angeben
default=argparse.SUPPRESS
. Wenn der Benutzer das Argument dann nicht verwendet, wird es nicht imargs
Namespace angezeigt. Aber das könnte komplizierter sein:Intern
parser
führt der eine Liste vonseen_actions
und verwendet sie für 'erforderliche' und 'gegenseitig ausschließende' Tests. Aber es steht Ihnen außerhalb von nicht zur Verfügungparse_args
.quelle
Ich denke, die Option
default=argparse.SUPPRESS
ist am sinnvollsten. Anstatt zu prüfen, ob das Argument istnot None
, prüft man dann, ob das Argumentin
der resultierende Namespace ist.Beispiel:
Verwendung:
Argument wird nicht geliefert:quelle
testfoo.py: error: argument --foo: expected one argument
--foo
ohne Wert verwenden möchten (dh1
in meinem Beispiel), müssen Sie diesnargs=0
in deradd_argument
Funktion angeben .action='store_true'
unten stehende Antwort in meinem eigentlichen Code verwendet.python argparse_test.py --foo 1
?Sie können ein optional übergebenes Flag mit
store_true
undstore_false
Argumentaktionsoptionen überprüfen :Auf diese Weise müssen Sie sich keine Gedanken über die Überprüfung durch Bedingungen machen
is not None
. Sie suchen einfach nachTrue
oderFalse
. Weitere Informationen zu diesen Optionen finden Sie in den Dokumenten hierquelle
Wenn Ihr Argument positionell ist (dh es hat kein "-" oder "-" Präfix, nur das Argument, normalerweise einen Dateinamen), können Sie den Parameter nargs verwenden , um dies zu tun:
quelle
Hier ist meine Lösung, um zu sehen, ob ich eine Argparse-Variable verwende
Dies könnte einen besseren Einblick in die obige Antwort geben, die ich für mein Programm verwendet und angepasst habe.
quelle
Um den Kommentar von @ kcpr zu der (derzeit akzeptierten) Antwort von @Honza Osobne zu adressieren
Man kann zuerst überprüfen, ob das Argument bereitgestellt wurde, indem man es mit dem
Namespace
Objekt abd vergleicht, das diedefault=argparse.SUPPRESS
Option bereitstellt (siehe Antworten von @ hpaulj und @Erasmus Cedernaes und dieses python3-Dokument ). Wenn es nicht angegeben wurde, setzt man es auf einen Standardwert.Verwendung
quelle
Sehr einfach, nachdem die Variable args durch 'args = parser.parse_args ()' definiert wurde, enthält sie auch alle Daten der Variablen der Teilmenge args. Um zu überprüfen, ob eine Variable gesetzt ist oder nicht, wird angenommen, dass 'action = "store_true" verwendet wird ...
quelle