Перечисления Enum в Python - это набор символических имен (членов), привязанных к уникальным постоянным значениям. Внутри перечисления члены могут сравниваться по идентичности, а само перечисление может повторяться.
Перечисления Enum похожи на глобальные переменные, но предлагают более полезную функцию repr(), группировку, безопасность типов и некоторые другие функции. Они наиболее полезны, когда есть переменная, которая может принимать одно из ограниченного набора значений, например, дни недели или основные цвета RGB.
И так, перечисления Enum:
Color(1)) для извлечения элементов по значению,Color['RED'] для извлечения членов по имени.Перечисления создаются либо с использованием синтаксиса класса, либо с использованием функционального синтаксиса:
from enum import Enum # синтаксис класса class Color(Enum): RED = 1 GREEN = 2 BLUE = 3 # функциональный синтаксис Color = Enum('Color', ['RED', 'GREEN', 'BLUE'])
Несмотря на то, для создания перечислений может использоваться синтаксис класса, перечисления не являются обычными классами Python.
Обратите внимание.
UPPER_CASE, так же этот стиль будет использоваться в примерах.Модуль enum определяет пять классов перечислений, которые можно использовать для определения уникальных наборов имен и значений: enum.Enum, enum.IntEnum, enum.StrEnum, enum.Flag и enum.IntFlag. Он также определяет несколько декораторов и один помощник enum.auto.
enum.Enum:Базовый класс enum.Enum предназначен для создания нумерованных констант.
enum.IntEnum:Базовый класс enum.IntEnum предназначен для создания перечисляемых констант, которые являются подклассами int.
StrEnum:Базовый класс для создания перечислимых констант, которые также являются подклассами str. (Добавлен в Python 3.11)
enum.IntFlag:Базовый класс enum.IntFlag предназначен для создания перечисляемых констант, которые можно комбинировать с помощью побитовых операторов без потери членства в enum.IntFlag. Члены базового класса enum.IntFlag также являются подклассами int.
enum.Flag:Базовый класс enum.Flag предназначен для создания пронумерованных констант, которые можно комбинировать с помощью побитовых операций без потери их принадлежности к базовому классу enum.Flag.
enum.EnumCheck:Класс enum.EnumCheck - это перечисление со значениями CONTINUOUS, NAMED_FLAGS и UNIQUE для использования с декоратором @enum.verify(), чтобы гарантировать, что данное перечисление соответствует различным ограничениям. (Добавлен в Python 3.11)
enum.FlagBoundary:Класс enum.FlagBoundary - это перечисление со значениями STRICT, CONFORM, EJECT и KEEP, которое позволяет более детально контролировать, как обрабатываются недопустимые значения в перечислении. (Добавлен в Python 3.11)
enum.auto:Класс enum.auto заменяет экземпляры членов enum.Enum соответствующим значением. По умолчанию начальное значение начинается с 1.
@enum.unique():Декоратор @enum.unique() обеспечивает привязку только одного имени к любому значению.
@enum.property():Декоратор @enum.property() аналогичный встроенному @property(), но специально для перечислений. Позволяет членам Enum иметь атрибуты, не конфликтуя с именами членов перечислений. (Добавлен в Python 3.11)
Обратите внимание, что атрибуты и члены перечисления должны быть определены в отдельных классах. Например, атрибуты value и name определены в классе Enum, а подклассы Enum могут определять элементы с именами value и name.
@enum.verify():Декоратор @enum.verify() проверяет выбираемые пользователем ограничения перечисления. (Добавлен в Python 3.11)
Новое в Python 3.6: добавлены enum.Flag, enum.IntFlag, enum.auto
Новое в Python 3.11: добавлены enum.StrEnum, enum.EnumCheck, enum.FlagBoundary, @enum.verify(), @enum.property().
enum.IntEnum, enum.StrEnum и enum.IntFlagЭти три типа перечислений предназначены для замены существующих целочисленных и строковых значений. Как таковые, они имеют дополнительные ограничения:
__str__ использует значение, а не имя члена перечисления.__format__ использует __str__, следовательно будет использовать значение члена перечисления вместо его имениЕсли не нужны эти ограничения, то можно либо создать свой собственный базовый класс, смешав тип int или str самостоятельно:
from enum import Enum class MyIntEnum(int, Enum): pass
или можно переназначить соответствующий str() и т. д. в своем перечислении:
from enum import IntEnum class MyIntEnum(IntEnum): __str__ = IntEnum.__str__
enum:>>> from enum import Enum >>> class Planet(Enum): ... MERCURY = (3.303e+23, 2.4397e6) ... VENUS = (4.869e+24, 6.0518e6) ... EARTH = (5.976e+24, 6.37814e6) ... MARS = (6.421e+23, 3.3972e6) ... JUPITER = (1.9e+27, 7.1492e7) ... SATURN = (5.688e+26, 6.0268e7) ... URANUS = (8.686e+25, 2.5559e7) ... NEPTUNE = (1.024e+26, 2.4746e7) ... def __init__(self, mass, radius): ... self.mass = mass # in kilograms ... self.radius = radius # in meters ... @property ... def surface_gravity(self): ... # universal gravitational constant (m3 kg-1 s-2) ... G = 6.67300E-11 ... return G * self.mass / (self.radius * self.radius) ... >>> Planet.EARTH.value (5.976e+24, 6378140.0) >>> Planet.EARTH.surface_gravity 9.802652743337129