parser.add_argument('-auto', action='store_true')
Jak mogę przechowywać fałsz, jeśli -auto
jest nieokreślony? Ledwo pamiętam, że w ten sposób przechowuje Brak, jeśli nie jest określony
parser.add_argument('-auto', action='store_true')
Jak mogę przechowywać fałsz, jeśli -auto
jest nieokreślony? Ledwo pamiętam, że w ten sposób przechowuje Brak, jeśli nie jest określony
Ta store_true
opcja automatycznie tworzy domyślną wartość False .
Podobnie, store_false
domyś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
-bar
, todest
jest automatycznie ustawiana nabar
, na podstawie hg.python.org/cpython/rev/49677cc6d83a . Jednak nie widzę, gdzie w kodzie jest ustawione to domyślne zachowanie. Zawszedest
jawnie ustawiałem argument. Myślę też, że pozostawieniebar
domyślnej opcjidest
for--bar
nie ma sensu, jeśli tak--bar
jeststore_false
. Nie powinno takdest
byćnotbar
w tym przypadku?Z
bieganie
plony
Wygląda więc na to, że
False
domyślnie przechowuje .źródło
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 -
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 -
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 -
źródło
parser.add_argument('--stop_logging', action='store_false', dest='use_logging')
.store_false faktycznie będzie domyślnie
0
domyślnie (możesz przetestować, aby zweryfikować). Aby zmienić to, co domyślnie, po prostu dodajdefault=True
do swojej deklaracji.Więc w tym przypadku:
parser.add_argument('-auto', action='store_true', default=True)
źródło
>>> 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)