Я хотел бы использовать argparse для разбора логических аргументов командной строки, написанных как «--foo True» или «--foo False». Например:
my_program --my_boolean_flag False
Однако следующий тестовый код не делает то, что я хотел бы:
import argparse
parser = argparse.ArgumentParser(description="My parser")
parser.add_argument("--my_bool", type=bool)
cmd_line = ["--my_bool", "False"]
parsed_args = parser.parse(cmd_line)
К сожалению, parsed_args.my_bool
оценивает True
. Это имеет место даже тогда, когда я изменяюсь, чтобы cmd_line
быть ["--my_bool", ""]
, что удивительно, так как bool("")
оценивает в False
.
Как я могу получить argparse разобрать "False"
, "F"
и их строчные варианты быть False
?
parser.add_argument('--feature', dest='feature', type=lambda x:bool(distutils.util.strtobool(x)))
. Когда опция используется, это решение обеспечит bool
тип со значением True
или False
. Когда опция не используется, вы получите None
. ( distutils.util.strtobool(x)
из другого вопроса stackoverflow )
parser.add_argument('--my_bool', action='store_true', default=False)
parser.add_argument('--feature', dest='feature', default=False, action='store_true')
. Это решение гарантирует, что вы всегда получитеbool
тип со значениемTrue
илиFalse
. (У этого решения есть ограничение: ваш вариант должен иметь значение по умолчанию.)