Возвращение Enum из функции, в которой enum имеет повторяющиеся значения - PullRequest
1 голос
/ 10 марта 2020

У меня есть перечисление для представления различных возможных значений функции.

class A(Enum):
    NOT_FOUND = NONE
    INAQUATE = NONE
    POSITIVE = 1
    # Some more

Однако при возврате этого перечисления из функции

def search_function(target = 1):
    if target == 1:
        return A.INAQUATE
    else:
        return A.POSITIVE

возвращает A.NOT_FOUND, а не A.INAQUATE, который разбивает программу на строку.

Python 3.7.6

>>> from enum import Enum
>>> class A(Enum):
...     NOT_FOUND = None
...     INAQUATE = None
...     POSITIVE = 1
... 
>>> def search_function(target = 1):
...     if target == 1:
...             return A.INAQUATE
...     return A.NOT_FOUND
... 
>>> search_function()
<A.NOT_FOUND: None>

Есть ли способ правильно вернуть A.INAQUATE?

1 Ответ

1 голос
/ 10 марта 2020

Когда Enum s имеют повторяющиеся значения, члены - это один и тот же объект, на который ссылаются оба имени в самом Enum:

>>> list(A)
[<A.NOT_FOUND: None>, <A.POSITIVE: 1>]

>>> A.INAQUATE is A.NOT_FOUND
True

Самое простое решение - дать каждому члену уникальная ценность. Следующее простое решение - использовать библиотеку aenum 1 :

from aenum import Enum, NoAlias

class A(Enum):
    #
    _settings_ = NoAlias
    #
    NOT_FOUND = None
    INAQUATE = None
    POSITIVE = 1

И использовать:

>>> list(A)
[<A.INAQUATE: None>, <A.NOT_FOUND: None>, <A.POSITIVE: 1>]

>>> A.INAQUATE is A.NOT_FOUND
False

NB Когда при использовании перечислений NoAlias функция поиска по значению теряется:

>>> A(1)
Traceback (most recent call last):
  ...
TypeError: NoAlias enumerations cannot be looked up by value

1 Раскрытие информации: я являюсь автором Python stdlib Enum, enum34 backport и расширенное перечисление (aenum) .

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