簡體   English   中英

如何在 Python “ConfigParser”部分中引發異常而不是返回 None?

[英]How to raise exception instead of returning None in Python “ConfigParser” section?

我在使用configparser模塊時遇到問題。

import configparser

config = configparser.ConfigParser()
config.read_dict({"foo": {}})

foo = config["foo"]
foo.getboolean("missing_field")

如果解析的配置缺少必填字段,我希望我的代碼引發異常。 但是,在這種情況下, getboolean()返回None而不是如預期的那樣引發KeyError

我可能會使用foo["missing_field"]會引發異常。 但是,在這種情況下,我放棄了 boolean 轉換。

我可以顯式測試if res is None:並手動拋出異常,但我有很多配置字段,所以這很麻煩。

Python 是否提供了一種優雅的方式來強制進行嚴格的配置解析?

您可以直接在配置 object 上使用getboolean

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

如果missing_field不存在,這將引發NoOptionError

configparser.NoOptionError: No option 'missing_field' in section: 'foo'

代理上getboolean的不同行為是因為它使用默認的fallback=None調用相關的 getter。 問題是“常規” get使用特殊的_UNSET object 作為默認后備,然后執行:

if fallback is _UNSET:
    raise NoOptionError(option, section)
else:
    return fallback

因此,作為替代方案(在@Tomerikoo 的答案的討論中出現,@chepner 在對此答案的評論中建議),您可以在使用部分代理時傳入_UNSET作為后備值。 根據您的原始代碼:

foo.getboolean("missing_field", fallback=configparser._UNSET)

好吧...@Kemp 找到了一個可以輕松解決此問題的微調行為,但是由於我已經遇到了以下麻煩,所以我不妨將其發布...


默認行為不會引發異常,但為什么不根據您的需要“修復”它呢? 您可以創建一個ConfigParser的子類,它只包裝getboolean並檢查option是否實際存在,然后返回原始的getboolean值。 我認為這個選項的好處是您根本不需要更改代碼 - 只需更改初始config =...行以使用新的 class:

import configparser

class MyConfig(configparser.ConfigParser):
    def getboolean(self, section, option, *, raw=False, vars=None,
                   fallback=configparser_UNSET, **kwargs):
        if self.get(section, option, raw=raw, vars=vars, fallback=fallback) == fallback:
            raise configparser.NoOptionError(option, section)

        return super().getboolean(section, option, raw=raw, vars=vars, fallback=fallback)

現在做:

config = MyConfig()
config.read_dict({"foo": {'existing_field': '1'}})

foo = config["foo"]
print(foo.getboolean("existing_field"))
print(foo.getboolean("missing_field"))

將給出(截斷):

True
Traceback (most recent call last):
...
configparser.NoOptionError: No option 'missing_field' in section: 'foo'

相對於:

True
None

使用常規configparser.ConfigParser

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM