Enum _missing_ функция не глушит ValueError - PullRequest
2 голосов
/ 28 января 2020

Я пытаюсь настроить Enum, который будет возвращать 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

Поиск в Google предполагает, что _missing_ перехватывает только ValueError в случае вызова, поэтому KeyError и TypeError меня не удивляют, но я не знаю, почему G(2) вызывает ValueError вместо возврата None.

1 Ответ

2 голосов
/ 28 января 2020

2 основные вещи, которые отсутствуют в документации по функции _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 или любое другое значение, наиболее подходящее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...