У меня есть несколько перечислений, определенных с помощью
from enum import Enum
class EnumA(str, Enum):
RED = "red"
class EnumB(str, Enum):
BLUE = "blue"
Как мне сравнить тип этих классов/перечислений, скажем, x=EnumA.RED
? Следующее не работает.
type(x) is enum
type(x) is EnumType
type(x) is Enum
Я не хочу сравнивать классы напрямую, так как у меня много перечислений.
Используйте isinstance:
isinstance(x, Enum)
x
имеет тип EnumA
, ничего больше.
enum
— это модуль.EnumType
вообще не определен — это метакласс, используемый для определения Enum
.Enum
— это класс, определенный в модуле enum
; это родительский класс EnumA
.В любом случае, никогда не сравнивайте type
объекты напрямую. Используйте isinstance
, чтобы определить, относится ли значение к заданному типу. (Для проверки типа объекта вы практически никогда не заботитесь о разнице между классом и его суперклассом (ами).)
>>> isinstance(x, EnumA)
True
>>> isinstance(x, Enum)
True
Последнее верно, потому что EnumA
является подклассом Enum
.
Ба, я думал, что помню, как его называли EnumMeta
.
@chepner: Это было. Это продолжало сбивать меня с толку в трассировках, поэтому я переименовал его. (EnumMeta
все еще рабочий псевдоним.)
Почему это не упоминается в документации?
Он находится в списке изменений.
Чтобы узнать тип переменной, вы должны сравнить ее с Enum или Enum, например:
тип (x) - это EnumA
Ну, на самом деле есть EnumType. Это
type(Enum)
(метакласс).