为何为Argparse添加type字段会改变其行为?
Argparse指定type=bool后行为异常的原因分析
第一个示例的行为逻辑
当未指定type参数时,argparse会直接将命令行传入的--bar=False中的False作为字符串赋值给args.bar。这是nargs='?'的规则决定的:
- 若仅输入
--bar(不带值),则使用const指定的True - 若输入
--bar=xxx(带值),则直接取用传入的xxx作为参数值,因此这里得到字符串'False'
第二个示例的问题根源
指定type=bool时,argparse会把传入的'False'字符串传给bool()函数做转换,但Python的bool()函数对任何非空字符串都会返回True——哪怕字符串内容是'False'、'0'这类看起来像“假”的内容,只要字符串不为空,bool(非空字符串)的结果都是True。
这里不是const值没被覆盖,而是传入的'False'被转换成了True,最终输出恰好和const的值一致,本质是类型转换的特性导致的误解。
正确实现布尔参数的方式
如果想让--bar=False解析为布尔值False,不能直接用type=bool,可以自定义一个类型转换函数:
import argparse def str_to_bool(value): if isinstance(value, bool): return value if value.lower() in ('false', 'no', '0'): return False elif value.lower() in ('true', 'yes', '1'): return True raise argparse.ArgumentTypeError('Boolean value expected.') # 使用自定义类型 parser = argparse.ArgumentParser() parser.add_argument('--bar', nargs='?', default=None, const=True, type=str_to_bool) args = parser.parse_args(['--bar=False']) print(args.bar) # 输出False
内容的提问来源于stack exchange,提问作者knowads
相关产品推荐
相关产品推荐

