为啥在 argparse 中,“真”总是“真”? [复制]

Posted

技术标签:

【中文标题】为啥在 argparse 中,“真”总是“真”? [复制]【英文标题】:Why in argparse, a 'True' is always 'True'? [duplicate]为什么在 argparse 中,“真”总是“真”? [复制] 【发布时间】:2017-11-17 14:33:10 【问题描述】:

这是最简单的 Python 脚本,名为 test.py:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--bool', default=True, type=bool, help='Bool type')
args = parser.parse_args()
print(args.bool)

但是当我在命令行上运行这段代码时:

python test.py --bool False
True

而当我的代码读取 '--bool', default=False 时,argparse 运行正确。

为什么?

【问题讨论】:

【参考方案1】:

您没有传入False 对象。您传入的是 'False' 字符串,这是一个非零长度的字符串。

只有长度为 0 的字符串测试为假:

>>> bool('')
False
>>> bool('Any other string is True')
True
>>> bool('False')  # this includes the string 'False'
True

请改用store_true or store_false action。对于default=True,请使用store_false

parser.add_argument('--bool', default=True, action='store_false', help='Bool type')

现在省略开关集args.boolTrue,使用--bool(没有进一步参数)将args.bool 设置为False

python test.py
True

python test.py --bool
False

如果您必须解析包含TrueFalse 的字符串,则必须明确地这样做:

def boolean_string(s):
    if s not in 'False', 'True':
        raise ValueError('Not a valid boolean string')
    return s == 'True'

并将其用作转换参数:

parser.add_argument('--bool', default=True, type=boolean_string, help='Bool type')

此时--bool False 将按照您的预期工作。

【讨论】:

标准库函数 distutils.util.strtobool() 函数可以用来代替 boolean_string() 并且还支持像“yes”和“no”这样的字符串(虽然它返回一个 0 或 1 的 int 所以你可能仍然如果你真的需要一个合适的布尔值,想包装它)

以上是关于为啥在 argparse 中,“真”总是“真”? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥一个变量对多个值的不等式检查总是返回真?

为啥一个变量对多个值的不等式检查总是返回真?

为啥 NaN = !NaN 返回真?

为啥在真机上运行android程序,logcat不显示

为啥CameraX预览在真机上模糊不清,怎么对焦?

我家的电脑为啥玩真三国无双3时一进去就说遇到问题需要关闭,信息有可能丢失,这是为啥呀?