当前位置: 首页 > 知识库问答 >
问题:

使用argparse分析布尔值

钱经赋
2023-03-14

我想使用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

共有2个答案

百里承业
2023-03-14

我认为更规范的方法是通过:

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 版本,您可以将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?
郦昆
2023-03-14

另一种解决方案使用了前面的建议,但带有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 bug报告。

 类似资料:
  • 问题内容: 我想使用argparse解析布尔命令行参数,写为“ –foo True”或“ –foo False”。例如: 但是,以下测试代码无法满足我的要求: 可悲的是,计算结果为。即使我更改为,情况也是如此,这令人惊讶,因为评估为。 如何获取argparse进行解析,以及它们的小写字母形式是什么? 问题答案: 另一个解决方案使用了先前的建议,但存在来自以下情况的“正确”解析错误: 这对于使用默认

  • 问题内容: 我想使用argparse解析布尔命令行参数,写为。例如: 但是,以下测试代码不能满足我的要求: 可悲的是,计算结果为True。即使我更改为,情况也是如此,这令人惊讶,因为评估为。 如何获取进行解析,以及它们的小写字母形式是什么? 问题答案: 另一个解决方案使用了先前的建议,但存在来自以下情况的“正确”解析错误: 这对于使用默认值进行切换非常有用。例如 允许我使用:

  • 我试图获得以下行为: python test.py= 当我使用 但是,如果我添加,试图强制强制强制转换为布尔值,它就会中断。在这种情况下 实际上最终存储。怎么回事??

  • 我正在尝试使用argparse模块使我的Python程序接受灵活的命令行参数。我想传递一个简单的布尔标志,并说或来执行代码中的相应分支。 请考虑以下内容。 这是为什么?!!intflag似乎解析正确,但布尔标志总是解析为,即使我在命令行参数中明确提到我希望它是。 我哪里错了?

  • 我注意到java有一个问题。它不能解析空值的布尔类。我知道它有静态方法,但它的签名声明它只接受,而不接受。 换句话说,它有以下签名: 但不是: 检查布尔值而不陷入NullPointerException的最佳方法是什么?

  • 1. 简介 分布分析报告可以帮助您查看事件在不同区间的发生频次,从而判断用户的使用习惯和活跃情况。除了次数,您还能够查看其它事件指标的用户数量分布。 分布分析能够帮助您洞察这些问题: · 对比不同来源渠道的用户在站点的行为次数分布,如浏览页面1-3次,3-10次,10次以上,不同区间的用户数量有多少 · 上周推广活动客单价的人数分布情况 · 改版后,用户的每日启动次数是否增加 2. 使用说明 2.