关于python:为什么argparse没有正确解析我的布尔标志?

Why is argparse not parsing my boolean flag correctly?

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

我正试图使用argparse模块使我的python程序接受灵活的命令行参数。我想传递一个简单的布尔标志,并说TrueFalse以在我的代码中执行适当的分支。

考虑以下内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
import argparse

parser = argparse.ArgumentParser(prog='test.py',formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument('-boolflag', type=bool, default=True)
parser.add_argument('-intflag' , type=int, default=3)
args = parser.parse_args()

boolflag = args.boolflag
intflag  = args.intflag


print ("Bool Flag is", boolflag)
print ("Int Flag is",  intflag)

当我试图用python scrap.py -boolflag False -intflag 314执行它时,我得到了结果。

1
2
Bool Flag is  True
Int Flag is  314

为什么会这样?!!!intflag似乎被正确解析了,但是布尔标志总是被解析为True,即使我在命令行参数中明确地提到我希望它是False

我哪里出错了?


您试图将字符串"False"转换为布尔值:

1
2
>>> bool("False")
True

这不起作用,因为字符串"False"是一个非空值。所有非空字符串都有一个True布尔值。

store_false动作代替:

1
2
parser.add_argument('--disable-feature', dest='feature',
                    action='store_false')

现在使用该开关时,存储False,否则默认为True(由action='store_false'设置)。