Сообщить об ошибке.

Итерация и сравнение перечислений модуля enum

Итерация по членам перечисления.

Итерация по членам перечисления не дает псевдонимов:

>>> from enum import Enum
>>> class Shape(Enum):
...     SQUARE = 2
...     DIAMOND = 1
...     CIRCLE = 3
...     ALIAS_FOR_SQUARE = 2

>>> list(Shape)
# [<Shape.SQUARE: 2>, <Shape.DIAMOND: 1>, <Shape.CIRCLE: 3>]

Специальный атрибут __members__ - это упорядоченное сопоставление имен членам и реализован только для чтения. Он включает все имена, определенные в перечислении, включая псевдонимы:

>>> for name, member in Shape.__members__.items():
...     name, member
...
# ('SQUARE', <Shape.SQUARE: 2>)
# ('DIAMOND', <Shape.DIAMOND: 1>)
# ('CIRCLE', <Shape.CIRCLE: 3>)
# ('ALIAS_FOR_SQUARE', <Shape.SQUARE: 2>)

Атрибут __members__ может использоваться для программного доступа к членам перечисления. Например, поиск всех псевдонимов:

>>> [name for name, member in Shape.__members__.items() if member.name != name]
# ['ALIAS_FOR_SQUARE']

Сравнение членов перечисления.

Члены перечисления сравниваются по идентичности:

>>> from enum import Enum, auto
>>> class Color(Enum):
...     RED = auto()
...     BLUE = auto()
...     GREEN = auto()

>>> Color.RED is Color.RED
# True
>>> Color.RED is Color.BLUE
# False
>>> Color.RED is not Color.BLUE
# True

Упорядоченные сравнения значений перечисления модуля enum не поддерживаются. Члены перечисления не являются целыми числами (но смотрите "Производные перечислений enum.Enum"):

>>> Color.RED < Color.BLUE
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# TypeError: '<' not supported between instances of 'Color' and 'Color'

Тем не менее в перечислениях определены сравнения равенства:

>>> Color.BLUE == Color.RED
# False
>>> Color.BLUE != Color.RED
# True
>>> Color.BLUE == Color.BLUE
# True

Сравнения с не перечисляемыми значениями всегда будут сравниваться не равными. Опять же, класс enum.IntEnum был специально разработан для другого поведения:

>>> Color.BLUE == 2
# False