parser.add_argument('-auto', action='store_true')
Jak mogę przechowywać fałsz, jeśli -autojest nieokreślony? Ledwo pamiętam, że w ten sposób przechowuje Brak, jeśli nie jest określony
Odpowiedzi:
Ta store_trueopcja automatycznie tworzy domyślną wartość False .
Podobnie, store_falsedomyślnie przyjmuje wartość True, gdy argument wiersza poleceń nie jest obecny.
Źródło tego zachowania jest zwięzłe i jasne: http://hg.python.org/cpython/file/2.7/Lib/argparse.py#l861
Dokumenty argparse nie są jasne na ten temat, więc zaktualizuję je teraz: http://hg.python.org/cpython/rev/49677cc6d83a
Raymond Hettinger już odpowiedział na pytanie OP.
Jednak moja grupa napotkała problemy z czytelnością przy użyciu „store_false”. Zwłaszcza, gdy do naszej grupy dołączają nowi członkowie. Dzieje się tak, ponieważ najbardziej intuicyjnym sposobem myślenia jest to, że gdy użytkownik określa argument, wartością odpowiadającą temu argumentowi będzie True lub 1.
Na przykład, jeśli kod to -
parser.add_argument('--stop_logging', action='store_false')
Czytnik kodu może prawdopodobnie oczekiwać, że instrukcja rejestrowania będzie wyłączona, gdy wartość stop_logging jest true. Jednak kod taki jak poniższy doprowadzi do odwrotnego zachowania -
if not stop_logging:
#log
Z drugiej strony, jeśli interfejs jest zdefiniowany w następujący sposób, wówczas instrukcja „if” działa i jest bardziej intuicyjna w czytaniu -
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 faktycznie będzie domyślnie 0domyślnie (możesz przetestować, aby zweryfikować). Aby zmienić to, co domyślnie, po prostu dodaj default=Truedo swojej deklaracji.
Więc w tym przypadku:
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, todestjest automatycznie ustawiana nabar, na podstawie hg.python.org/cpython/rev/49677cc6d83a . Jednak nie widzę, gdzie w kodzie jest ustawione to domyślne zachowanie. Zawszedestjawnie ustawiałem argument. Myślę też, że pozostawieniebardomyślnej opcjidestfor--barnie ma sensu, jeśli tak--barjeststore_false. Nie powinno takdestbyćnotbarw tym przypadku?