为啥 argparse 不能正确解析我的布尔标志? [复制]

Posted

技术标签:

【中文标题】为啥 argparse 不能正确解析我的布尔标志? [复制]【英文标题】:Why is argparse not parsing my boolean flag correctly? [duplicate]为什么 argparse 不能正确解析我的布尔标志? [复制] 【发布时间】:2017-05-30 01:58:03 【问题描述】:

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

考虑以下问题。

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 执行它时,我得到了结果

Bool Flag is  True
Int Flag is  314

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

我哪里错了?

【问题讨论】:

【参考方案1】:

您正在尝试将字符串 "False" 转换为布尔值:

>>> bool("False")
True

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

改用store_false action:

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

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

【讨论】:

以上是关于为啥 argparse 不能正确解析我的布尔标志? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

使用 argparse 的有序和重复标志

为啥即使我写得正确,argparse 也不起作用并发送无效选项错误消息?

为啥使用 argparse 而不是 optparse?

argparse 未正确处理子解析器中的缩写

Argparse:制作所需的标志

Python 2.7 argparse:如何正确嵌套可选的互斥参数?