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
Odpowiedzi:
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
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 0
domyślnie (możesz przetestować, aby zweryfikować). Aby zmienić to, co domyślnie, po prostu dodaj default=True
do 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
, 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?