У меня есть несколько перечислений, определенных с помощью
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) (метакласс).