argparse store false, якщо не вказано


104
parser.add_argument('-auto', action='store_true')

Як я можу зберігати помилкові, якщо -autoце не вказано? Я чудово пам'ятаю, що таким чином він зберігає None, якщо не визначено

Відповіді:


171

store_trueОпція автоматично створює значення за замовчуванням значення False .

Так само store_falseза замовчуванням буде встановлено значення True, якщо аргумент командного рядка відсутній.

Джерело такої поведінки є коротким та зрозумілим: http://hg.python.org/cpython/file/2.7/Lib/argparse.py#l861

Документи argparse незрозумілі з цього питання, тому я зараз їх оновлюю : http://hg.python.org/cpython/rev/49677cc6d83a


2
Пара коментарів з цього приводу. По-перше, здається, що якщо параметр є -bar, то значення destавтоматично встановлюється на barоснові hg.python.org/cpython/rev/49677cc6d83a . Однак я не бачу, де ця поведінка за замовчуванням встановлена ​​в коді. Я завжди встановлював destаргумент прямо. Крім того , я думаю , дозволяючи по barзамовчуванням до destдля --barопції не має сенсу , якщо --barє store_false. Чи не повинно destбути notbarв цьому випадку?
Faheem Mitha

4
Я не розумів конвенційну конвенцію про іменування.
brainLoop

Я згоден, це трохи заплутано. У будь-якому випадку, "store_false" або "store_true" визначається як дія, а не значення за замовчуванням. Таким чином, коли ви додаєте цей аргумент до програми, зазначена дія запускається.
ady

15

З

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

біг

% test.py

врожайність

Namespace(auto=False)

Отже, схоже, воно зберігається Falseза замовчуванням.


3

Реймонд Хеттінгер вже відповідає на питання ОП.

Однак у моєї групи виникли проблеми з читальністю за допомогою "store_false". Особливо, коли до нашої групи приєднуються нові члени. Це тому, що найбільш інтуїтивно зрозуміти спосіб полягає в тому, що коли користувач вказує аргумент, значення, відповідне цьому аргументу, буде True або 1.

Наприклад, якщо код -

parser.add_argument('--stop_logging', action='store_false')

Зчитувач коду, можливо, очікує, що оператор журналу буде вимкнено, коли значення стоп-журналу є істинним. Але такий код, як наведено нижче, призведе до протилежної бажаної поведінки -

if not stop_logging:
    #log

З іншого боку, якщо інтерфейс визначений наступним чином, "if-заява" працює і є більш інтуїтивно зрозумілим -

parser.add_argument('--stop_logging', action='store_true')
if not stop_logging:
    #log

7
Ви можете встановити псевдонім призначення, що дозволить поліпшити читаність: parser.add_argument('--stop_logging', action='store_false', dest='use_logging').
Крассі

-4

Файл store_false фактично 0за замовчуванням (ви можете перевірити, щоб перевірити). Щоб змінити те, для чого він за замовчуванням, просто додайте default=Trueдо своєї декларації.

Отже, у цьому випадку: parser.add_argument('-auto', action='store_true', default=True)


Схоже, це не так у Python 2.7 та 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
Вибачте, це фактично поведінка optparse за замовчуванням. Аргпарсе за замовчуванням має бути зворотною частиною магазину. тобто "store_false" за замовчуванням має значення "True".
Unix-Ninja
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.