Antworten:
Die store_true
Option erstellt automatisch den Standardwert False .
Ebenso store_false
wird 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 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
parser.add_argument('--stop_logging', action='store_false', dest='use_logging')
.
store_false wird 0
standardmäßig verwendet (Sie können testen, um dies zu überprüfen). Um die Standardeinstellungen zu ändern, fügen default=True
Sie einfach Ihre Erklärung hinzu.
Also in diesem Fall:
parser.add_argument('-auto', action='store_true', default=True)
>>> 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)
-bar
, diedest
automatisch aufbar
basierend auf hg.python.org/cpython/rev/49677cc6d83a gesetzt wird . Ich sehe jedoch nicht, wo dieses Standardverhalten im Code festgelegt ist. Ich habe dasdest
Argument immer explizit gesetzt. Ich denke auch, dass es nicht wirklich Sinn macht , diebar
Standardeinstellungdest
für die--bar
Option zu verwenden, wenn dies der Fall--bar
iststore_false
. Sollte dasdest
nichtnotbar
in diesem Fall sein?