为了账号安全,请及时绑定邮箱和手机立即绑定

使用argparse解析布尔值

使用argparse解析布尔值

catspeake 2019-08-29 17:37:43
使用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错误报告


查看完整回答
反对 回复 2019-08-29
?
四季花海

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?


查看完整回答
反对 回复 2019-08-29
?
红颜莎娜

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')


查看完整回答
反对 回复 2019-08-29
  • 3 回答
  • 0 关注
  • 1261 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信