argparse przechowuj fałsz, jeśli nie określono


105
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:


173

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


2
Kilka uwag na ten temat. Po pierwsze, wydaje się, że jeśli opcja jest ustawiona -bar, to destjest automatycznie ustawiana na bar, na podstawie hg.python.org/cpython/rev/49677cc6d83a . Jednak nie widzę, gdzie w kodzie jest ustawione to domyślne zachowanie. Zawsze destjawnie ustawiałem argument. Myślę też, że pozostawienie bardomyślnej opcji destfor --barnie ma sensu, jeśli tak --barjest store_false. Nie powinno tak destbyć notbarw tym przypadku?
Faheem Mitha

6
Nie rozumiałem sprzecznej konwencji nazewnictwa.
brainLoop,

Zgadzam się, to trochę zagmatwane. W każdym razie „store_false” lub „store_true” jest określony jako akcja, a nie wartość domyślna. Dlatego po dodaniu tego argumentu do programu wyzwalana jest określona akcja.
ady

15

Z

import argparse
parser=argparse.ArgumentParser()
parser.add_argument('-auto', action='store_true', )
args=parser.parse_args()
print(args)

bieganie

% test.py

plony

Namespace(auto=False)

Wygląda więc na to, że Falsedomyślnie przechowuje .


3

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

7
Można ustawić docelowy alias, co poprawi czytelność: parser.add_argument('--stop_logging', action='store_false', dest='use_logging').
Krassi

-4

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)


Wydaje się, że tak nie jest w Pythonie 2.7 i 3.4: >>> 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)
Leynos

2
przepraszam, to właściwie jest domyślne zachowanie optparse. argparse powinno domyślnie odwracać wartość sklepu. tj. „store_false” domyślnie ma wartość „True”.
Unix-Ninja,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.