argparse store false, wenn nicht angegeben

104
parser.add_argument('-auto', action='store_true')

Wie kann ich false speichern, wenn -autoes nicht angegeben ist? Ich kann mich schwach daran erinnern, dass auf diese Weise None gespeichert wird, wenn nicht angegeben

siamii
quelle

Antworten:

170

Die store_trueOption erstellt automatisch den Standardwert False .

Ebenso store_falsewird standardmäßig True verwendet, wenn das Befehlszeilenargument nicht vorhanden ist.

Die Quelle für dieses Verhalten ist prägnant und klar: http://hg.python.org/cpython/file/2.7/Lib/argparse.py#l861

Die Argparse-Dokumente zu diesem Thema sind nicht klar, daher werde ich sie jetzt aktualisieren: http://hg.python.org/cpython/rev/49677cc6d83a

Raymond Hettinger
quelle
2
Ein paar Kommentare dazu. Erstens scheint es, dass wenn die Option ist -bar, die destautomatisch auf barbasierend auf hg.python.org/cpython/rev/49677cc6d83a gesetzt wird . Ich sehe jedoch nicht, wo dieses Standardverhalten im Code festgelegt ist. Ich habe das destArgument immer explizit gesetzt. Ich denke auch, dass es nicht wirklich Sinn macht , die barStandardeinstellung destfür die --barOption zu verwenden, wenn dies der Fall --barist store_false. Sollte das destnicht notbarin diesem Fall sein?
Faheem Mitha
4
Ich habe die konträre Namenskonvention nicht verstanden.
brainLoop
Ich stimme zu, das ist etwas verwirrend. Auf jeden Fall wird 'store_false' oder 'store_true' als Aktion und nicht als Standardwert angegeben. Wenn Sie dieses Argument zum Programm hinzufügen, wird die angegebene Aktion ausgelöst.
Ady
15

Mit

import argparse
parser=argparse.ArgumentParser()
parser.add_argument('-auto', action='store_true', )
args=parser.parse_args()
print(args)

Laufen

% test.py

ergibt

Namespace(auto=False)

Es scheint also Falsestandardmäßig zu speichern .

unutbu
quelle
3

Raymond Hettinger beantwortet die Frage von OP bereits.

Bei meiner Gruppe sind jedoch Lesbarkeitsprobleme mit "store_false" aufgetreten. Besonders wenn neue Mitglieder unserer Gruppe beitreten. Dies liegt daran, dass es am intuitivsten zu denken ist, dass, wenn ein Benutzer ein Argument angibt, der diesem Argument entsprechende Wert True oder 1 ist.

Zum Beispiel, wenn der Code - ist

parser.add_argument('--stop_logging', action='store_false')

Der Codeleser kann wahrscheinlich erwarten, dass die Protokollierungsanweisung deaktiviert ist, wenn der Wert in stop_logging wahr ist. Code wie der folgende führt jedoch zum Gegenteil des gewünschten Verhaltens -

if not stop_logging:
    #log

Wenn andererseits die Schnittstelle wie folgt definiert ist, funktioniert die "if-Anweisung" und ist intuitiver zu lesen -

parser.add_argument('--stop_logging', action='store_true')
if not stop_logging:
    #log
MonsieurBeilto
quelle
7
Sie können einen Zielalias festlegen, der die Lesbarkeit verbessert : parser.add_argument('--stop_logging', action='store_false', dest='use_logging').
Krassi
-4

store_false wird 0standardmäßig verwendet (Sie können testen, um dies zu überprüfen). Um die Standardeinstellungen zu ändern, fügen default=TrueSie einfach Ihre Erklärung hinzu.

Also in diesem Fall: parser.add_argument('-auto', action='store_true', default=True)

Unix-Ninja
quelle
Dies scheint in Python 2.7 und 3.4 nicht der Fall zu sein: >>> parser.add_argument('--bar', action='store_false') _StoreFalseAction(option_strings=['--bar'], dest='bar', nargs=0, const=False, default=True, type=None, choices=None, help=None, metavar=None) >>> parser.parse_args([]) Namespace(bar=True)
Leynos
2
Entschuldigung, das ist eigentlich das Standardverhalten von optparse. argparse sollte standardmäßig die Umkehrung des Speichers verwenden. Das heißt, 'store_false' ist standardmäßig 'True'.
Unix-Ninja