用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

回答:

使用以前的建议的另一个解决方案,但是使用argparse的“正确”解析错误

def str2bool(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=NICE,
                        help="Activate nice mode.")

允许我使用:

script --nice
script --nice <bool>

并仍然使用默认值(特定于用户设置)。一个(间接相关)的缺点是这种方法是“nargs”可能会获得一个位置参数 – 参见this related questionthis argparse bug report

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: parsing boolean values with argparse

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

− 4 = 2