Итерация по членам перечисления не дает псевдонимов:
>>> 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