Когда 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
) .