【发布时间】:2013-02-07 03:51:14
【问题描述】:
我想使用 argparse 来解析写为“--foo True”或“--foo False”的布尔命令行参数。例如:
my_program --my_boolean_flag False
但是,下面的测试代码并没有达到我想要的效果:
import argparse
parser = argparse.ArgumentParser(description="My parser")
parser.add_argument("--my_bool", type=bool)
cmd_line = ["--my_bool", "False"]
parsed_args = parser.parse(cmd_line)
遗憾的是,parsed_args.my_bool 的计算结果为 True。即使我将cmd_line 更改为["--my_bool", ""] 也是如此,这令人惊讶,因为bool("") 评估为False。
如何让 argparse 将 "False"、"F" 及其小写变体解析为 False?
【问题讨论】:
-
这里是@mgilson's answer
parser.add_argument('--feature', dest='feature', default=False, action='store_true')的单行解释。此解决方案将确保您始终获得具有值True或False的bool类型。 (此解决方案有一个约束:您的选项必须具有默认值。) -
这里是对@Maxim's answer
parser.add_argument('--feature', dest='feature', type=lambda x:bool(distutils.util.strtobool(x)))的单行解释。使用该选项时,此解决方案将确保bool类型的值为True或False。如果不使用该选项,您将获得None。 (distutils.util.strtobool(x)is from another stackoverflow question) -
像
parser.add_argument('--my_bool', action='store_true', default=False)这样的东西怎么样 -
对于@TrevorBoydSmith 的回答,请尝试使用
import distutils.util而不是import disutils导入。见this answer -
刚刚遇到了同样的问题。令人震惊的是 argparse 模块有多么不必要的大和杂草丛生,但它仍然没有做它应该开箱即用的简单事情。更糟糕的是,它做错了。
标签: python boolean argparse command-line-arguments