python - 如何在 Python“ConfigParser”部分引发异常而不是返回 None?
问题描述
我在使用该configparser
模块时遇到问题。
import configparser
config = configparser.ConfigParser()
config.read_dict({"foo": {}})
foo = config["foo"]
foo.getboolean("missing_field")
如果解析的配置缺少必填字段,我希望我的代码引发异常。但是,在这种情况下getboolean()
返回而不是按预期None
提高 a 。KeyError
我可能会使用foo["missing_field"]
which 确实会引发异常。但是,在这种情况下,我放弃了布尔转换。
我可以手动显式测试if res is None:
并抛出异常,但我有很多配置字段,所以会很麻烦。
Python 是否提供了一种优雅的方式来强制进行严格的配置解析?
解决方案
您可以getboolean
直接在配置对象上使用:
config.getboolean("foo", "missing_field")
这将引发一个NoOptionError
ifmissing_field
不存在:
configparser.NoOptionError: No option 'missing_field' in section: 'foo'
代理上的不同行为getboolean
是因为它使用 default 调用相关的 getter fallback=None
。问题是“常规”get
使用特殊_UNSET
对象作为默认后备,然后执行以下操作:
if fallback is _UNSET:
raise NoOptionError(option, section)
else:
return fallback
因此,作为替代方案(在讨论@Tomerikoo 的答案和@chepner 在对此答案的评论中建议),您可以在_UNSET
使用部分代理时作为后备值传入。根据您的原始代码:
foo.getboolean("missing_field", fallback=configparser._UNSET)
推荐阅读
- python - 错误:无法导入“flask-app-hello”
- javascript - HTML 表单根据选择选项更改 url 参数
- react-native - 在本机反应中使用 createStackNavigator 从标题中删除行
- python - 'type' 类型的 Django self.renderer_classes 对象没有 len()
- https - 主机名 localhost 未验证
- angular - “mat-dialog-actions”不是角材料中的已知元素
- go - pre_shared_key 密钥扩展不提供 psk_key_exchange_modes 扩展
- javascript - 使用 ExpressJS 和 EJS 从后端获取数据到前端的更好方法
- android - Android相对布局动态内容重叠
- r - 清理推文,<> 中出现随机字母和数字问题