Я пытаюсь разобраться, как передать логическое значение False из командной строки в argparser. Мой оргинальный код выглядел так:
import argparse
parser = argparse.ArgumentParser(allow_abbrev=True)
parser.add_argument('-data', default=True, type=bool, help='uses the history file')
args = parser.parse_args(sys.argv[1:])
Из командной строки я набрал: python myscript.py -data False
Также варианты с одиночными и двойными кавычками вокруг False. Когда я просматриваю содержимое пространства имен args, args.data всегда является True.
Поэтому я изменил определение аргумента с bool на str со строкой "True" по умолчанию, как показано ниже:
parser.add_argument('-data', default="True", type=str, help='uses the history file')
Затем я добавил несколько массивов аргументов, чтобы получить логическое значение, которое я действительно хотел:
if re.search("f", args.data, re.I):
args.data = False
else:
args.data = True
Это обходное решение действительно работает. Есть лучший способ сделать это?
Если аргумент должен быть логическим, вам следует просто использовать store_true
или store_false
, так что наличие самого параметра приведет к значению True
или False
, а отсутствие опции приведет к значению False
или True
, соответственно.
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='store_true')
>>> parser.add_argument('--bar', action='store_false')
>>> parser.add_argument('--baz', action='store_false')
>>> parser.parse_args('--foo --bar'.split())
Namespace(foo=True, bar=False, baz=True)
Вы можете использовать параметр store_false
или store_true
для add_argument
(см. Документацию argparse). Например, если вы хотите, чтобы значение по умолчанию было True
вы можете добавить аргумент с action='store_false'
:
parser.add_argument('--no-data', action='store_false', help='don't use the history file')
Тогда args.no_data
будет False
если вы запустите python command.py --no-data
и True
если вы запустите python command.py
без аргумента --no-data
.
def my_bool(s):
return s != 'False'
parser.add_argument('-data',default=True,type=my_bool)