Я хотел бы использовать 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. (У этого решения есть ограничение: ваш вариант должен иметь значение по умолчанию.)