使用argparse解析布尔值

使用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。这种情况即使我改变cmd_line["--my_bool", ""],这是令人惊讶的,因为bool("")重新评估False

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


catspeake
浏览 1272回答 3
3回答

慕桂英3389331

使用之前建议的另一种解决方案,但具有“正确”解析错误argparse:def&nbsp;str2bool(v): &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;isinstance(v,&nbsp;bool): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;v&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;v.lower()&nbsp;in&nbsp;('yes',&nbsp;'true',&nbsp;'t',&nbsp;'y',&nbsp;'1'): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;True &nbsp;&nbsp;&nbsp;&nbsp;elif&nbsp;v.lower()&nbsp;in&nbsp;('no',&nbsp;'false',&nbsp;'f',&nbsp;'n',&nbsp;'0'): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;False &nbsp;&nbsp;&nbsp;&nbsp;else: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;raise&nbsp;argparse.ArgumentTypeError('Boolean&nbsp;value&nbsp;expected.')这对于使用默认值制作开关非常有用;&nbsp;例如parser.add_argument("--nice",&nbsp;type=str2bool,&nbsp;nargs='?', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const=True,&nbsp;default=False, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;help="Activate&nbsp;nice&nbsp;mode.")允许我使用:script&nbsp;--nice script&nbsp;--nice&nbsp;<bool>并仍然使用默认值(特定于用户设置)。这种方法的一个(间接相关的)缺点是'nargs'可能会捕获位置参数 - 请参阅此相关问题和这个argparse错误报告。

四季花海

我认为一个更规范的方法是通过:command&nbsp;--feature和command&nbsp;--no-featureargparse&nbsp;很好地支持这个版本:parser.add_argument('--feature',&nbsp;dest='feature',&nbsp;action='store_true')parser.add_argument('--no-feature',&nbsp;dest='feature',&nbsp;action='store_false')parser.set_defaults(feature=True)当然,如果你真的想要--arg <True|False>版本,你可以传递ast.literal_eval“类型”或用户定义的函数...def&nbsp;t_or_f(arg): &nbsp;&nbsp;&nbsp;&nbsp;ua&nbsp;=&nbsp;str(arg).upper() &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;'TRUE'.startswith(ua): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;True &nbsp;&nbsp;&nbsp;&nbsp;elif&nbsp;'FALSE'.startswith(ua): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;False &nbsp;&nbsp;&nbsp;&nbsp;else: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pass&nbsp;&nbsp;#error&nbsp;condition&nbsp;maybe?

红颜莎娜

我建议mgilson的答案,但有互相排斥的群体,这样就可以不使用--feature,并--no-feature在同一时间。command&nbsp;--feature和command&nbsp;--no-feature但不是command&nbsp;--feature&nbsp;--no-feature脚本:feature_parser&nbsp;=&nbsp;parser.add_mutually_exclusive_group(required=False)feature_parser.add_argument('--feature',&nbsp;dest='feature',&nbsp;action='store_true')feature_parser.add_argument('--no-feature',&nbsp;dest='feature',&nbsp;action='store_false')parser.set_defaults(feature=True)如果要设置其中许多帮助,则可以使用此帮助程序:def&nbsp;add_bool_arg(parser,&nbsp;name,&nbsp;default=False): &nbsp;&nbsp;&nbsp;&nbsp;group&nbsp;=&nbsp;parser.add_mutually_exclusive_group(required=False) &nbsp;&nbsp;&nbsp;&nbsp;group.add_argument('--'&nbsp;+&nbsp;name,&nbsp;dest=name,&nbsp;action='store_true') &nbsp;&nbsp;&nbsp;&nbsp;group.add_argument('--no-'&nbsp;+&nbsp;name,&nbsp;dest=name,&nbsp;action='store_false') &nbsp;&nbsp;&nbsp;&nbsp;parser.set_defaults(**{name:default})add_bool_arg(parser,&nbsp;'useful-feature')add_bool_arg(parser,&nbsp;'even-more-useful-feature')
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python