argparse store false, если не указано


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

Как я могу сохранить false, если -autoон не указан? Я смутно помню, что таким образом он хранит None, если не указано

Ответы:


173

Параметр 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

6
Я не понимал противоречивого соглашения об именах.
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

Раймонд Хеттингер уже отвечает на вопрос OP.

Однако у моей группы возникли проблемы с удобочитаемостью при использовании store_false. Особенно, когда к нашей группе присоединяются новые участники. Это потому, что наиболее интуитивно понятный способ состоит в том, что когда пользователь указывает аргумент, значение, соответствующее этому аргументу, будет True или 1.

Например, если код -

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

Читатель кода может ожидать, что оператор регистрации будет отключен, если значение в stop_logging истинно. Но такой код, как следующий, приведет к противоположному желаемому поведению:

if not stop_logging:
    #log

С другой стороны, если интерфейс определен следующим образом, тогда «if-statement» работает и его более интуитивно понятно для чтения:

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').
Krassi

-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 по умолчанию. argparse по умолчанию должен быть инверсным хранилищу. т. е. store_false по умолчанию равен True.
Unix-Ninja
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.