Argparse optional boolean
本问题已经有最佳答案,请猛点这里访问。
我正在尝试以下行为:
- python test.py=>存储foo=false
- python test.py--foo=>存储foo=true
- python test.py--foo bool=>store foo=bool
它在我使用时起作用
1 | parser.add_argument('--foo',nargs='?', default=False, const=True) |
但是,如果我添加
1 | python test.py --foo False |
实际上最终存储的是
你确定你需要那个图案吗?
关于您的问题,请记住命令行值是一个字符串,并且,
我强烈建议你用
1 2 | parser.add_argument('--foo', default=False, action='store_true') parser.add_argument('--no-foo', dest='foo', action='store_false') |
如果有其他配置机制可以将
如果您不需要
但是,如果您的用例或其他约束特别要求您的命令行必须有一些
1 2 3 4 5 6 7 8 9 10 | def str_to_bool(value): if isinstance(value, bool): return value if value.lower() in {'false', 'f', '0', 'no', 'n'}: return False elif value.lower() in {'true', 't', '1', 'yes', 'y'}: return True raise ValueError(f'{value} is not a valid boolean value') parser.add_argument('--foo', type=str_to_bool, nargs='?', const=True, default=False) |
const 值用于省略参数值的nargs='?' 参数。在这里,当使用--foo 时,设置foo=True 。- 开关完全不使用时,使用
default=False 。 type=str_to_bool 用于处理--foo 案件。
演示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | $ cat so52403065.py from argparse import ArgumentParser parser = ArgumentParser() def str_to_bool(value): if value.lower() in {'false', 'f', '0', 'no', 'n'}: return False elif value.lower() in {'true', 't', '1', 'yes', 'y'}: return True raise ValueError(f'{value} is not a valid boolean value') parser.add_argument('--foo', type=str_to_bool, nargs='?', const=True, default=False) print(parser.parse_args()) $ python so52403065.py Namespace(foo=False) $ python so52403065.py --foo Namespace(foo=True) $ python so52403065.py --foo True Namespace(foo=True) $ python so52403065.py --foo no Namespace(foo=False) $ python so52403065.py --foo arrbuggrhellno usage: so52403065.py [-h] [--foo [FOO]] so52403065.py: error: argument --foo: invalid str_to_bool value: 'arrbuggrhellno' |
对于布尔参数,应使用
1 | parser.add_argument('--foo', action='store_true') |
因此,缺少
1 | python test.py |
将导致
1 | python test.py --foo |
会导致