我想使用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("")
evalutates为 False
.
如何让argparse解析 "False"
, "F"
,它们的小写变体为 False
?
13 回答
使用之前建议的另一种解决方案,但"correct"的"correct"解析错误:
这对于使用默认值制作开关非常有用;例如
允许我使用:
并仍然使用默认值(特定于用户设置) . 这种方法的一个(间接相关的)缺点是'nargs'可能会捕获位置参数 - 请参阅this related question和this argparse bug report .
我认为一个更规范的方法是通过:
和
argparse
很好地支持这个版本:当然,如果你真的想要
--arg <True|False>
版本,你可以传递ast.literal_eval
作为"type",或用户定义的函数......我推荐mgilson的回答,但是有一个相互排斥的小组
这样你就不能同时使用
--feature
和--no-feature
.和
但不是
脚本:
如果要设置其中许多帮助,则可以使用此帮助程序:
关于
type=bool
和type='bool'
可能意味着什么,似乎有些混乱 . 一个(或两个)是否应该'运行函数bool()
,或'return a boolean'?现在type='bool'
什么都没有 .add_argument
给出'bool' is not callable
错误,就像使用type='foobar'
或type='int'
一样 .但
argparse
确实有注册表,可以让你定义像这样的关键字 . 它主要用于action
,例如`action = 'store_true' . 您可以看到已注册的关键字:它显示一个字典
定义了许多操作,但只有一种类型,默认类型
argparse.identity
.此代码定义了'bool'关键字:
parser.register()
未记录,但也未隐藏 . 在大多数情况下,程序员不需要知道它,因为type
和action
获取函数和类值 . 有很多stackoverflow示例为两者定义自定义值 .如果从前面的讨论中看不出来,
bool()
并不意味着'parse a string' . 从Python文档:与此形成鲜明对比
oneliner:
我一直在寻找同样的问题,而且这个漂亮的解决方案是:
并使用它将字符串解析为boolean,如上所述 .
这是另一个没有额外行/ s来设置默认值的变体 . bool始终具有一个赋值,以便可以在没有预先检查的逻辑语句中使用它 .
除了@mgilson所说的,还应该注意的是,还有一个ArgumentParser.add_mutually_exclusive_group(required=False)方法可以使
--flag
和--no-flag
同时不被使用变得微不足道 .这适用于我期望的一切:
代码:
一种更简单的方法是使用如下 .
一种非常类似的方法是使用:
如果你在命令中设置参数--feature
参数将为True,如果你没有设置类型--feature,参数默认值总是为假!
我认为最规范的方式是: