parser.add_argument('-auto', action='store_true')
Как я могу сохранить false, если -auto
он не указан? Я смутно помню, что таким образом он хранит None, если не указано
Ответы:
Параметр 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
Раймонд Хеттингер уже отвечает на вопрос 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
parser.add_argument('--stop_logging', action='store_false', dest='use_logging')
.
store_false фактически будет по умолчанию 0
по умолчанию (вы можете проверить, чтобы проверить). Чтобы изменить значение по умолчанию, просто добавьте его default=True
в свое объявление.
Итак, в этом случае:
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
, тоdest
автоматически устанавливается значение наbar
основе hg.python.org/cpython/rev/49677cc6d83a . Однако я не вижу, где это поведение по умолчанию установлено в коде. Я всегдаdest
явно указывал аргумент. Кроме того, я думаю, чтоbar
значение по умолчаниюdest
для этой--bar
опции не имеет смысла, если--bar
это такstore_false
. Разве не должноdest
бытьnotbar
в этом случае?