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 и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
Потяните за рычаг выброса энергососущих проектов
Потяните за рычаг выброса энергососущих проектов
На этой неделе моя команда отменила проект, над которым я работал. Неделя усилий пошла насмарку.
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Привет, люди RPA, это снова я и я несу подарки! В очередном моем приключении о том, как создавать ботов для облегчения рутины. Вот, думаю, стоит...
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
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

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