为什么在argparse中,'True'始终为'True'?

时间:2017-06-15 07:51:03

标签: python argparse

这是最简单的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 个答案:

答案 0 :(得分:18)

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

只有一串长度为0的测试为false:

>>> 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将按预期工作。