使用 argparse 解析布尔值

新手上路,请多包涵

我想使用 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 。 This is the case even when I change cmd_line to be ["--my_bool", ""] , which is surprising, since bool("") evalutates to False .

如何让 argparse 解析 "False""F" ,它们的小写变体是 False

原文由 SuperElectric 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

这实际上已经过时了。对于 Python 3.7+, Argparse 现在支持布尔参数(搜索 BooleanOptionalAction)。

实现如下所示:

 import argparse

ap = argparse.ArgumentParser()

# List of args
ap.add_argument('--foo', default=True, type=bool, help='Some helpful text that is not bar. Default = True')

# Importable object
args = ap.parse_args()

另一件要提的事情:这将通过 argparse.ArgumentTypeError 阻止参数的 True 和 False 以外的所有条目。如果您想出于任何原因尝试更改它,您可以为此创建一个自定义错误类。

原文由 Zach Rieck 发布,翻译遵循 CC BY-SA 4.0 许可协议

我认为更规范的方法是通过:

 command --feature

command --no-feature

argparse 很好地支持这个版本:

Python 3.9+

 parser.add_argument('--feature', action=argparse.BooleanOptionalAction)

Python < 3.9:

 parser.add_argument('--feature', action='store_true')
parser.add_argument('--no-feature', dest='feature', action='store_false')
parser.set_defaults(feature=True)


当然,如果你真的想要 --arg <True|False> 版本,你可以传递 ast.literal_eval 作为“类型”,或者用户定义的函数……

 def t_or_f(arg):
    ua = str(arg).upper()
    if 'TRUE'.startswith(ua):
       return True
    elif 'FALSE'.startswith(ua):
       return False
    else:
       pass  #error condition maybe?

原文由 mgilson 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题