Antworten:
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 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 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)
>>> 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, diedestautomatisch aufbarbasierend auf hg.python.org/cpython/rev/49677cc6d83a gesetzt wird . Ich sehe jedoch nicht, wo dieses Standardverhalten im Code festgelegt ist. Ich habe dasdestArgument immer explizit gesetzt. Ich denke auch, dass es nicht wirklich Sinn macht , diebarStandardeinstellungdestfür die--barOption zu verwenden, wenn dies der Fall--bariststore_false. Sollte dasdestnichtnotbarin diesem Fall sein?