如何捕获argparse的Namespace对象不存在属性并处理AttributeError报错?
实现方法
方案1:无侵入式读取(推荐)
直接使用Python内置getattr方法读取参数,不存在时直接返回默认值False,无需修改原有参数解析逻辑:
import argparse parser = argparse.ArgumentParser() parser.add_argument("--first", default='first', help='first argument') args = parser.parse_args() # 读取参数时传入默认值,第三个参数为属性不存在时的返回值 x = getattr(args, 'x', False) first = getattr(args, 'first', False) # 已定义参数可正常读取,不受影响
该方案改动最小,适合仅需要处理个别不确定参数的场景。
方案2:自定义Namespace全局生效
如果需要让所有未定义参数访问时都自动返回False,可以自定义继承自argparse.Namespace的类,重写__getattr__魔法方法,解析参数时传入自定义类的实例即可:
import argparse class FalseDefaultNamespace(argparse.Namespace): def __getattr__(self, name): return False parser = argparse.ArgumentParser() parser.add_argument("--first", default='first', help='first argument') # 解析时指定自定义命名空间 args = parser.parse_args(namespace=FalseDefaultNamespace()) print(args.x) # 不存在的属性直接返回False print(args.first) # 已定义的参数正常返回对应值
注意:如果需要兼容双下划线开头的魔法属性,可以在
__getattr__中添加判断,对双下划线开头的属性抛出原有AttributeError即可。
内容的提问来源于stack exchange,提问作者j35t3r
相关产品推荐
相关产品推荐

