关于python:为什么在argparse中,’True’总是’True’?

Why in argparse, a 'True' is always 'True'?

本问题已经有最佳答案,请猛点这里访问。

下面是最简单的python脚本,名为test.py:

1
2
3
4
5
6
import argparse

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

但当我在命令行上运行此代码时:

1
2
python test.py --bool False
True

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

为什么?


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

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

1
2
3
4
5
6
>>> bool('')
False
>>> bool('Any other string is True')
True
>>> bool('False')  # this includes the string 'False'
True

使用store_truestore_false动作代替。对于default=True,使用store_false

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

现在省略该开关将args.bool设置为True,使用--bool(无进一步参数)将args.bool设置为False

1
2
3
4
5
python test.py
True

python test.py --bool
False

如果必须解析包含TrueFalse的字符串,则必须显式执行以下操作:

1
2
3
4
def boolean_string(s):
    if s not in {'False', 'True'}:
        raise ValueError('Not a valid boolean string')
    return s == 'True'

并以此作为转换参数:

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

在这一点上,--bool False将发挥你所期望的作用。