使用argparse解析布尔值我想使用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?
3 回答
慕桂英3389331
TA贡献2036条经验 获得超8个赞
使用之前建议的另一种解决方案,但具有“正确”解析错误argparse
:
def str2bool(v): if isinstance(v, bool): return v if v.lower() in ('yes', 'true', 't', 'y', '1'): return True elif v.lower() in ('no', 'false', 'f', 'n', '0'): return False else: raise argparse.ArgumentTypeError('Boolean value expected.')
这对于使用默认值制作开关非常有用; 例如
parser.add_argument("--nice", type=str2bool, nargs='?', const=True, default=False, help="Activate nice mode.")
允许我使用:
script --nice script --nice <bool>
并仍然使用默认值(特定于用户设置)。这种方法的一个(间接相关的)缺点是'nargs'可能会捕获位置参数 - 请参阅此相关问题和这个argparse错误报告。
四季花海
TA贡献1811条经验 获得超5个赞
我认为一个更规范的方法是通过:
command --feature
和
command --no-feature
argparse
很好地支持这个版本:
parser.add_argument('--feature', dest='feature', action='store_true')parser.add_argument('--no-feature', dest='feature', action='store_false')parser.set_defaults(feature=True)
当然,如果你真的想要--arg <True|False>
版本,你可以传递ast.literal_eval
“类型”或用户定义的函数...
def t_or_f(arg): ua = str(arg).upper() if 'TRUE'.startswith(ua): return True elif 'FALSE'.startswith(ua): return False else: pass #error condition maybe?
红颜莎娜
TA贡献1842条经验 获得超12个赞
我建议mgilson的答案,但有互相排斥的群体
,这样就可以不使用--feature
,并--no-feature
在同一时间。
command --feature
和
command --no-feature
但不是
command --feature --no-feature
脚本:
feature_parser = parser.add_mutually_exclusive_group(required=False)feature_parser.add_argument('--feature', dest='feature', action='store_true')feature_parser.add_argument('--no-feature', dest='feature', action='store_false')parser.set_defaults(feature=True)
如果要设置其中许多帮助,则可以使用此帮助程序:
def add_bool_arg(parser, name, default=False): group = parser.add_mutually_exclusive_group(required=False) group.add_argument('--' + name, dest=name, action='store_true') group.add_argument('--no-' + name, dest=name, action='store_false') parser.set_defaults(**{name:default})add_bool_arg(parser, 'useful-feature')add_bool_arg(parser, 'even-more-useful-feature')
添加回答
举报
0/150
提交
取消