Python сравнивает тип классов (str, enum)

У меня есть несколько перечислений, определенных с помощью

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

Я не хочу сравнивать классы напрямую, так как у меня много перечислений.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
53
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Используйте isinstance:

isinstance(x, Enum)
Ответ принят как подходящий

x имеет тип EnumA, ничего больше.

  1. enum — это модуль.
  2. EnumType вообще не определен — это метакласс, используемый для определения Enum.
  3. Enum — это класс, определенный в модуле enum; это родительский класс EnumA.

В любом случае, никогда не сравнивайте type объекты напрямую. Используйте isinstance, чтобы определить, относится ли значение к заданному типу. (Для проверки типа объекта вы практически никогда не заботитесь о разнице между классом и его суперклассом (ами).)

>>> isinstance(x, EnumA)
True
>>> isinstance(x, Enum)
True

Последнее верно, потому что EnumA является подклассом Enum.

Ну, на самом деле есть EnumType. Это type(Enum) (метакласс).

wim 19.02.2023 01:00

Ба, я думал, что помню, как его называли EnumMeta.

chepner 19.02.2023 17:53

@chepner: Это было. Это продолжало сбивать меня с толку в трассировках, поэтому я переименовал его. (EnumMeta все еще рабочий псевдоним.)

Ethan Furman 20.02.2023 02:35

Почему это не упоминается в документации?

chepner 20.02.2023 15:06

Он находится в списке изменений.

wim 20.02.2023 20:16

Чтобы узнать тип переменной, вы должны сравнить ее с Enum или Enum, например:

тип (x) - это EnumA

Другие вопросы по теме