首页 > 解决方案 > 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

标签: pythonpython-3.xenums

解决方案


文档中关于_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.nullG.missing任何最合适的值。


推荐阅读