python - Enum _missing_ 函数没有使 ValueError 静音
问题描述
我正在尝试设置一个枚举,None
如果找不到该值,它将返回。该文档提到了一个函数_missing_
,但没有解释有关该函数的任何细节:
_missing_
– 未找到值时使用的查找函数;可能会被覆盖
环顾四周后,似乎这是classmethod
带有签名的cls, value
,所以我尝试设置它,但它不起作用。
>>> class G(enum.Enum):
... @classmethod
... def _missing_(cls, value):
... return None
... a = 1
...
>>> G(1)
<G.a: 1>
>>> G(2)
Traceback (most recent call last):
...
ValueError: 2 is not a valid G
>>> G['b']
KeyError: 'b'
>>> G.b
AttributeError: b
谷歌搜索表明_missing_
仅在调用案例中捕获 ValueError ,因此 KeyError 和 TypeError 并不让我感到惊讶,但我不知道为什么G(2)
会引发 ValueError 而不是 return None
。
解决方案
文档中关于_missing_
函数缺少的两个主要内容是问题中的签名,以及返回类型必须是 Enum 的成员这一事实。如果None
返回,则错误根本不会被消除。
此行为只能通过源检查或不同的错误消息看到:
>>> class G(enum.Enum):
... @classmethod
... def _missing_(cls, value):
... return "a truthy value" # I suspected that the error may have been caused by a falsey return
... a = 1
...
>>> G(2)
ValueError: 2 is not a valid G
During handling of the above exception, another exception occured:
Traceback (most recent call last):
...
TypeError: error in G._missing_: returned 'a truthy value' instead of None or a valid member
因此,处理这种情况的唯一方法是使用前哨G.none
,G.null
或G.missing
任何最合适的值。
推荐阅读
- python - 检查两个列表中元素的索引是否连续
- javascript - 如何在反应中呈现一些多变的选择?
- javascript - 将选项保存到 chrome 存储失败
- amazon-web-services - 将 AWS CLI 配置文件用于特定节点程序的上下文
- php - 如何从 Woo Commerce 存档页面 URL 中删除品牌或任何文本?
- web-crawler - Stormcrawler - 当 http.content.limit 为 -1 时,解析器螺栓上的 stackoverflow 错误
- azure-devops - VSTS/Azure Devops Dashboard Widget into image
- reactjs - 尝试使用 axios.get() 检索数据,但 Promise 似乎永远不会返回
- ide - Pycharm 认为我使用的是 python 3.5< 但我使用的是 3.7
- sql-server - SSIS 如何加载具有多行的单个成员。