首页 > 解决方案 > 如何在 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 是否提供了一种优雅的方式来强制进行严格的配置解析?

标签: pythonpython-3.xconfigparser

解决方案


您可以getboolean直接在配置对象上使用:

config.getboolean("foo", "missing_field")

这将引发一个NoOptionErrorifmissing_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)

推荐阅读