![](/img/trans.png)
[英]Python Calling a raise exception instead of returning in recursive function
[英]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.