Содержание страницы
enum – Поддержка перечислений¶enum – Support for enumerations
Добавлено в версии 3.4.
Исходный код: Lib/enum.py
Перечисление:
это набор символических имён (членов), привязанных к уникальным значениям
может быть перебрано для возврата канонических (т.е. не псевдонимов) членов в порядке определения
использует синтаксис вызова для возврата членов по значению
использует синтаксис индексации для возврата членов по имени
Перечисления создаются либо с помощью синтаксиса class, либо с помощью синтаксиса вызова функции:
>>> from enum import Enum
>>> # синтаксис класса
>>> class Color(Enum):
... RED = 1
... GREEN = 2
... BLUE = 3
>>> # функциональный синтаксис
>>> Color = Enum('Color', [('RED', 1), ('GREEN', 2), ('BLUE', 3)])
Хотя для создания перечислений можно использовать синтаксис class, перечисления не являются обычными классами Python. См. Чем перечисления отличаются? для получения дополнительной информации.
Примечание
Терминология
Класс
Colorявляется перечислением (или enum)Атрибуты
Color.RED,Color.GREENи т.д. являются членами перечисления (или членами) и по сути являются константами.Члены перечисления имеют имена и значения (имя
Color.RED–RED, значениеColor.BLUE–3и т.д.)
Содержимое модуля¶Module contents
typeдля Enum и его подклассов.Базовый класс для создания перечисляемых констант.
Базовый класс для создания перечисляемых констант, которые также являются подклассами
int. (Примечания)Базовый класс для создания перечисляемых констант, которые также являются подклассами
str. (Примечания)Базовый класс для создания перечисляемых констант, которые можно комбинировать с помощью побитовых операций без потери их принадлежности к
Flag.Базовый класс для создания перечисляемых констант, которые можно комбинировать с помощью побитовых операторов без потери их принадлежности к
IntFlag. ЧленыIntFlagтакже являются подклассамиint. (Примечания)Перечисление со значениями
CONTINUOUS,NAMED_FLAGSиUNIQUE, для использования сverify(), чтобы гарантировать соблюдение различных ограничений для заданного перечисления.Перечисление со значениями
STRICT,CONFORM,EJECTиKEEP, которое обеспечивает более детальный контроль над обработкой недопустимых значений в перечислении.Экземпляры заменяются подходящим значением для членов Enum.
StrEnumпо умолчанию принимает значение в нижнем регистре имени члена, в то время как другие перечисления по умолчанию начинаются с 1 и увеличиваются оттуда.Позволяет членам
Enumиметь атрибуты без конфликта с именами членов. Атрибутыvalueиnameреализованы таким образом.Декоратор класса перечисления, который гарантирует, что каждому значению соответствует только одно имя.
Декоратор класса перечисления, который проверяет выбираемые пользователем ограничения для перечисления.
Превращает
objв член. Может использоваться как декоратор.Не превращает
objв член. Может использоваться как декоратор.Возвращает список всех целых чисел, являющихся степенями двойки, содержащихся во флаге.
Как встроенная
bin(), за исключением того, что отрицательные значения представляются в dополнительном коде, и старший бит всегда указывает знак (0означает положительное,1– отрицательное).
Добавлено в версии 3.6: Flag, IntFlag, auto
Добавлено в версии 3.11: StrEnum, EnumCheck, ReprEnum, FlagBoundary, property, member, nonmember, global_enum, show_flag_values
Добавлено в версии 3.13: EnumDict
Типы данных¶Data types
- class enum.EnumType¶
EnumType – это метакласс для перечислений enum. Есть возможность создать подкласс EnumType – подробнее см. в разделе Subclassing EnumType.
EnumTypeотвечает за установку правильных методов__repr__(),__str__(),__format__()и__reduce__()в конечном перечислении enum, а также за создание членов перечисления, корректную обработку дубликатов, обеспечение итерации по классу перечисления и т.д.Добавлено в версии 3.11: До версии 3.11
EnumTypeназывалсяEnumMeta, который всё ещё доступен как псевдоним.- __call__(cls, value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)¶
Этот метод вызывается двумя разными способами:
для поиска существующего члена:
- cls:
Вызываемый класс перечисления.
- value:
Значение для поиска.
для использования перечисления
clsдля создания нового перечисления (только если существующее перечисление не имеет членов):- cls:
Вызываемый класс перечисления.
- value:
Имя нового создаваемого перечисления.
- names:
Имена/значения членов нового перечисления.
- модуль:
Имя модуля, в котором создаётся новое перечисление.
- qualname:
Фактическое расположение в модуле, где можно найти это перечисление.
- тип:
Примесный тип для нового перечисления.
- start:
Первое целое значение для перечисления (используется функцией
auto).- boundary:
Как обрабатывать значения, выходящие за пределы диапазона в битовых операциях (только для
Flag).
- __contains__(cls, member)¶
Возвращает
True, если member принадлежитcls:>>> some_var = Color.RED >>> some_var in Color True >>> Color.RED.value in Color True
Изменено в версии 3.12: До Python 3.12 при проверке вхождения элемента, не являющегося членом Enum, вызывалось исключение
TypeError.
- __dir__(cls)¶
Возвращает
['__class__', '__doc__', '__members__', '__module__']и имена членов в cls:>>> dir(Color) ['BLUE', 'GREEN', 'RED', '__class__', '__contains__', '__doc__', '__getitem__', '__init_subclass__', '__iter__', '__len__', '__members__', '__module__', '__name__', '__qualname__', '_generate_next_value_', '_missing_']
- __getitem__(cls, name)¶
Возвращает член Enum из cls, соответствующий name, или вызывает
KeyError:>>> Color['BLUE'] <Color.BLUE: 3>
- __iter__(cls)¶
Возвращает каждый член из cls в порядке определения:
>>> list(Color) [<Color.RED: 1>, <Color.GREEN: 2>, <Color.BLUE: 3>]
- __len__(cls)¶
Возвращает количество членов в cls:
>>> len(Color) 3
- __members__¶
Возвращает отображение каждого имени enum на его член, включая псевдонимы
- __reversed__(cls)¶
Возвращает каждый член из cls в обратном порядке определения:
>>> list(reversed(Color)) [<Color.BLUE: 3>, <Color.GREEN: 2>, <Color.RED: 1>]
- class enum.Enum¶
Enum – это базовый класс для всех перечислений enum.
- name¶
Имя, используемое для определения члена
Enum:>>> Color.BLUE.name 'BLUE'
- value¶
Значение, присвоенное члену
Enum:>>> Color.RED.value 1
Значение члена; может быть задано в
__new__().Примечание
Значения членов Enum
Значения членов могут быть любыми:
int,strи т. д. Если точное значение не важно, можно использовать экземплярыauto, и подходящее значение будет выбрано автоматически. Подробнее см.auto.Хотя можно использовать изменяемые/нехешируемые значения, такие как
dict,listили изменяемыйdataclass, они будут оказывать квадратичное влияние на производительность при создании по сравнению с общим количеством изменяемых/нехешируемых значений в перечислении.
- _name_¶
Имя члена.
- _order_¶
Больше не используется, сохранено для обратной совместимости. (атрибут класса, удаляется при создании класса).
Атрибут
_order_может быть указан, чтобы помочь синхронизировать код Python 2 и Python 3. Он будет сверяться с фактическим порядком перечисления и вызывать ошибку, если они не совпадают:>>> class Color(Enum): ... _order_ = 'RED GREEN BLUE' ... RED = 1 ... BLUE = 3 ... GREEN = 2 ... Traceback (most recent call last): ... TypeError: member order does not match _order_: ['RED', 'BLUE', 'GREEN'] ['RED', 'GREEN', 'BLUE']
Примечание
В коде Python 2 атрибут
_order_необходим, поскольку порядок определения теряется до того, как его можно зафиксировать.Добавлено в версии 3.6.
- _ignore_¶
_ignore_используется только во время создания и удаляется из перечисления после завершения создания._ignore_– это список имён, которые не станут членами, и их имена также будут удалены из готового перечисления. См. пример TimePeriod.Добавлено в версии 3.7.
- __dir__(self)¶
Возвращает
['__class__', '__doc__', '__module__', 'name', 'value']и все публичные методы, определённые в self.__class__:>>> from enum import Enum >>> import datetime as dt >>> class Weekday(Enum): ... MONDAY = 1 ... TUESDAY = 2 ... WEDNESDAY = 3 ... THURSDAY = 4 ... FRIDAY = 5 ... SATURDAY = 6 ... SUNDAY = 7 ... @classmethod ... def today(cls): ... print(f'today is {cls(dt.date.today().isoweekday()).name}') ... >>> dir(Weekday.SATURDAY) ['__class__', '__doc__', '__eq__', '__hash__', '__module__', '_add_alias_', '_add_value_alias_', '_generate_next_value_', '_missing_', 'name', 'today', 'value']
- _generate_next_value_(name, start, count, last_values)¶
- name:
Имя определяемого члена (например, 'RED').
- start:
Начальное значение для Enum; по умолчанию 1.
- count:
Количество уже определённых членов, не включая текущий.
- last_values:
Список предыдущих значений.
Метод staticmethod, используемый для определения следующего значения, возвращаемого
auto.Примечание
Для стандартных классов
Enumследующее выбираемое значение – это максимальное увиденное значение, увеличенное на единицу.Для классов
Flagследующее выбираемое значение будет следующей по величине степенью двойки.Этот метод может быть переопределён, например:
>>> from enum import auto, Enum >>> class PowersOfThree(Enum): ... @staticmethod ... def _generate_next_value_(name, start, count, last_values): ... return 3 ** (count + 1) ... FIRST = auto() ... SECOND = auto() ... >>> PowersOfThree.SECOND.value 9
Добавлено в версии 3.6.
Изменено в версии 3.13: В предыдущих версиях использовалось последнее увиденное значение вместо наибольшего.
- __init__(self, *args, **kwds)¶
По умолчанию ничего не делает. Если в определении члена задано несколько значений, эти значения становятся отдельными аргументами для
__init__; например:>>> from enum import Enum >>> class Weekday(Enum): ... MONDAY = 1, 'Mon'
Weekday.__init__()будет вызван какWeekday.__init__(self, 1, 'Mon')
- __init_subclass__(cls, **kwds)¶
Метод класса classmethod, используемый для дальнейшей настройки последующих подклассов. По умолчанию ничего не делает.
- _missing_(cls, value)¶
Метод класса classmethod для поиска значений, не найденных в cls. По умолчанию он ничего не делает, но может быть переопределён для реализации собственного поиска:
>>> from enum import auto, StrEnum >>> class Build(StrEnum): ... DEBUG = auto() ... OPTIMIZED = auto() ... @classmethod ... def _missing_(cls, value): ... value = value.lower() ... for member in cls: ... if member.value == value: ... return member ... return None ... >>> Build.DEBUG.value 'debug' >>> Build('deBUG') <Build.DEBUG: 'debug'>
Добавлено в версии 3.6.
- __new__(cls, *args, **kwds)¶
По умолчанию не существует. Если указан в определении класса перечисления или в примешиваемом классе (например,
int), все значения, заданные в определении члена, будут переданы; например:>>> from enum import Enum >>> class MyIntEnum(int, Enum): ... TWENTYSIX = '1a', 16
приводит к вызову
int('1a', 16)и значению26для члена.Примечание
При написании пользовательского
__new__не используйтеsuper().__new__– вместо этого вызывайте соответствующий__new__.
- __repr__(self)¶
Возвращает строку, используемую для вызовов repr(). По умолчанию возвращает имя Enum, имя элемента и значение, но может быть переопределено:
>>> from enum import auto, Enum >>> class OtherStyle(Enum): ... ALTERNATE = auto() ... OTHER = auto() ... SOMETHING_ELSE = auto() ... def __repr__(self): ... cls_name = self.__class__.__name__ ... return f'{cls_name}.{self.name}' ... >>> OtherStyle.ALTERNATE, str(OtherStyle.ALTERNATE), f"{OtherStyle.ALTERNATE}" (OtherStyle.ALTERNATE, 'OtherStyle.ALTERNATE', 'OtherStyle.ALTERNATE')
- __str__(self)¶
Возвращает строку, используемую для вызовов str(). По умолчанию возвращает имя Enum и имя элемента, но может быть переопределено:
>>> from enum import auto, Enum >>> class OtherStyle(Enum): ... ALTERNATE = auto() ... OTHER = auto() ... SOMETHING_ELSE = auto() ... def __str__(self): ... return f'{self.name}' ... >>> OtherStyle.ALTERNATE, str(OtherStyle.ALTERNATE), f"{OtherStyle.ALTERNATE}" (<OtherStyle.ALTERNATE: 1>, 'ALTERNATE', 'ALTERNATE')
- __format__(self)¶
Возвращает строку, используемую для вызовов format() и f-строк. По умолчанию возвращает возвращаемое значение
__str__(), но может быть переопределено:>>> from enum import auto, Enum >>> class OtherStyle(Enum): ... ALTERNATE = auto() ... OTHER = auto() ... SOMETHING_ELSE = auto() ... def __format__(self, spec): ... return f'{self.name}' ... >>> OtherStyle.ALTERNATE, str(OtherStyle.ALTERNATE), f"{OtherStyle.ALTERNATE}" (<OtherStyle.ALTERNATE: 1>, 'OtherStyle.ALTERNATE', 'ALTERNATE')
Примечание
Использование
autoсEnumдаёт целые числа с возрастающим значением, начиная с1.Изменено в версии 3.12: Добавлена поддержка Dataclass.
- _add_alias_()¶
Добавляет новое имя как псевдоним существующего элемента:
>>> Color.RED._add_alias_("ERROR") >>> Color.ERROR <Color.RED: 1>
Вызывает
NameError, если имя уже назначено другому элементу.Добавлено в версии 3.13.
- _add_value_alias_()¶
Добавляет новое значение как псевдоним существующего элемента:
>>> Color.RED._add_value_alias_(42) >>> Color(42) <Color.RED: 1>
ВызываетValueError, если значение уже связано с другим элементом.Пример см. в MultiValueEnum.Добавлено в версии 3.13.
- class enum.IntEnum¶
IntEnum – то же, что и
Enum, но его элементы также являются целыми числами и могут использоваться везде, где можно использовать целое число. Если над элементом IntEnum выполняется какая-либо целочисленная операция, результирующее значение теряет статус перечисления.>>> from enum import IntEnum >>> class Number(IntEnum): ... ONE = 1 ... TWO = 2 ... THREE = 3 ... >>> Number.THREE <Number.THREE: 3> >>> Number.ONE + Number.TWO 3 >>> Number.THREE + 5 8 >>> Number.THREE == 3 True
Примечание
Использование
autoсIntEnumдаёт целые числа с возрастающим значением, начиная с1.Изменено в версии 3.11:
__str__()теперьint.__str__(), чтобы лучше поддерживать вариант использования замены существующих констант.__format__()уже былint.__format__()по той же причине.
- class enum.StrEnum¶
StrEnum – то же, что и
Enum, но его элементы также являются строками и могут использоваться почти везде, где можно использовать строку. Результат любой строковой операции, выполненной над элементом StrEnum или с его участием, не является частью перечисления.>>> from enum import StrEnum, auto >>> class Color(StrEnum): ... RED = 'r' ... GREEN = 'g' ... BLUE = 'b' ... UNKNOWN = auto() ... >>> Color.RED <Color.RED: 'r'> >>> Color.UNKNOWN <Color.UNKNOWN: 'unknown'> >>> str(Color.UNKNOWN) 'unknown'
Примечание
В стандартной библиотеке есть места, где проверяется точное совпадение с
str, а не с подклассомstr(например,type(unknown) == strвместоisinstance(unknown, str)), и в таких случаях потребуется использоватьstr(MyStrEnum.MY_MEMBER).Примечание
Использование
autoсStrEnumдаёт имя элемента в нижнем регистре в качестве значения.Примечание
__str__()–str.__str__(), чтобы лучше поддерживать вариант использования замены существующих констант.__format__()такжеstr.__format__()по той же причине.Добавлено в версии 3.12.
- class enum.Flag¶
Flag– то же, что иEnum, но его элементы поддерживают побитовые операторы&(AND),|(OR),^(XOR) и~(INVERT); результаты этих операций являются (псевдонимами) элементов перечисления.- __contains__(self, value)¶
Возвращает True, если значение находится в self:
>>> from enum import Flag, auto >>> class Color(Flag): ... RED = auto() ... GREEN = auto() ... BLUE = auto() ... >>> purple = Color.RED | Color.BLUE >>> white = Color.RED | Color.GREEN | Color.BLUE >>> Color.GREEN in purple False >>> Color.GREEN in white True >>> purple in white True >>> white in purple False
- __iter__(self)¶
Возвращает все содержащиеся элементы, не являющиеся псевдонимами:
>>> list(Color.RED) [<Color.RED: 1>] >>> list(purple) [<Color.RED: 1>, <Color.BLUE: 4>]
Добавлено в версии 3.12.
- __len__(self)¶
Возвращает количество элементов во флаге:
>>> len(Color.GREEN) 1 >>> len(white) 3
Добавлено в версии 3.12.
- __bool__(self)¶
Возвращает True, если в флаге есть хотя бы один элемент, иначе False:
>>> bool(Color.GREEN) True >>> bool(white) True >>> black = Color(0) >>> bool(black) False
- __or__(self, other)¶
Возвращает текущий флаг, логически сложенный (OR) с другим:
>>> Color.RED | Color.GREEN <Color.RED|GREEN: 3>
- __and__(self, other)¶
Возвращает текущий флаг, логически умноженный (AND) с другим:
>>> purple & white <Color.RED|BLUE: 5> >>> purple & Color.GREEN <Color: 0>
- __xor__(self, other)¶
Возвращает текущий флаг, логически сложенный по исключающему ИЛИ (XOR) с другим:
>>> purple ^ white <Color.GREEN: 2> >>> purple ^ Color.GREEN <Color.RED|GREEN|BLUE: 7>
- __invert__(self)¶
Возвращает все флаги из type(self), которых нет в self:
>>> ~white <Color: 0> >>> ~purple <Color.GREEN: 2> >>> ~Color.RED <Color.GREEN|BLUE: 6>
- _numeric_repr_()¶
Функция, используемая для форматирования оставшихся безымянных числовых значений. По умолчанию – repr значения; распространённые варианты:
hex()иoct().
Примечание
Использование
autoсFlagдаёт целые числа, являющиеся степенями двойки, начиная с1.Изменено в версии 3.11: Вывод repr() для флагов с нулевым значением изменился. Теперь он:
>>> Color(0) <Color: 0>
- class enum.IntFlag¶
IntFlag– то же, что иFlag, но его члены также являются целыми числами и могут использоваться везде, где можно использовать целое число.>>> from enum import IntFlag, auto >>> class Color(IntFlag): ... RED = auto() ... GREEN = auto() ... BLUE = auto() ... >>> Color.RED & 2 <Color: 0> >>> Color.RED | 2 <Color.RED|GREEN: 3>
Если к члену IntFlag применяется целочисленная операция, результат не будет IntFlag:
>>> Color.RED + 2 3
Если к члену IntFlag применяется операция
Flagи:результат является допустимым IntFlag: возвращается IntFlag
результат не является допустимым IntFlag: результат зависит от настройки
FlagBoundary
repr()безымянных флагов с нулевым значением изменилось. Теперь он:>>> Color(0) <Color: 0>
Примечание
Использование
autoсIntFlagдаёт целые числа, являющиеся степенями двойки, начиная с1.Изменено в версии 3.11:
__str__()теперьint.__str__()для лучшей поддержки сценария замены существующих констант.__format__()уже былоint.__format__()по той же причине.Инверсия
IntFlagтеперь возвращает положительное значение – объединение всех флагов, не входящих в заданный флаг, вместо отрицательного значения. Это соответствует существующему поведениюFlag.
- class enum.ReprEnum¶
ReprEnumиспользуетrepr()отEnum, ноstr()от примешиваемого типа данных:Наследуйте от
ReprEnum, чтобы сохранитьstr()/format()примешиваемого типа данных вместо использованияEnum-умолчанияstr().Добавлено в версии 3.12.
- class enum.EnumCheck¶
EnumCheck содержит параметры, используемые декоратором
verify()для проверки различных ограничений; нарушение ограничений приводит кValueError.- UNIQUE¶
Гарантирует, что каждое значение имеет только одно имя:
>>> from enum import Enum, verify, UNIQUE >>> @verify(UNIQUE) ... class Color(Enum): ... RED = 1 ... GREEN = 2 ... BLUE = 3 ... CRIMSON = 1 Traceback (most recent call last): ... ValueError: aliases found in <enum 'Color'>: CRIMSON -> RED
- CONTINUOUS¶
Убедитесь, что между членом с наименьшим значением и членом с наибольшим значением нет пропущенных значений:
>>> from enum import Enum, verify, CONTINUOUS >>> @verify(CONTINUOUS) ... class Color(Enum): ... RED = 1 ... GREEN = 2 ... BLUE = 5 Traceback (most recent call last): ... ValueError: invalid enum 'Color': missing values 3, 4
- NAMED_FLAGS¶
Убедитесь, что любые группы/маски флагов содержат только именованные флаги – это полезно, когда значения задаются явно, а не генерируются с помощью
auto():>>> from enum import Flag, verify, NAMED_FLAGS >>> @verify(NAMED_FLAGS) ... class Color(Flag): ... RED = 1 ... GREEN = 2 ... BLUE = 4 ... WHITE = 15 ... NEON = 31 Traceback (most recent call last): ... ValueError: invalid Flag 'Color': aliases WHITE and NEON are missing combined values of 0x18 [use enum.show_flag_values(value) for details]
Примечание
CONTINUOUS и NAMED_FLAGS предназначены для работы с членами, имеющими целочисленные значения.
Добавлено в версии 3.12.
- class enum.FlagBoundary¶
FlagBoundaryопределяет обработку значений, выходящих за пределы диапазона, вFlagи его подклассах.- STRICT¶
Значения вне диапазона приводят к возбуждению
ValueError. Это поведение по умолчанию дляFlag:>>> from enum import Flag, STRICT, auto >>> class StrictFlag(Flag, boundary=STRICT): ... RED = auto() ... GREEN = auto() ... BLUE = auto() ... >>> StrictFlag(2**2 + 2**4) Traceback (most recent call last): ... ValueError: <flag 'StrictFlag'> invalid value 20 given 0b0 10100 allowed 0b0 00111
- CONFORM¶
Значения вне диапазона очищаются от недопустимых значений, оставляя допустимое значение
Flag:>>> from enum import Flag, CONFORM, auto >>> class ConformFlag(Flag, boundary=CONFORM): ... RED = auto() ... GREEN = auto() ... BLUE = auto() ... >>> ConformFlag(2**2 + 2**4) <ConformFlag.BLUE: 4>
- EJECT¶
Значения вне диапазона теряют членство в
Flagи возвращаются кint.>>> from enum import Flag, EJECT, auto >>> class EjectFlag(Flag, boundary=EJECT): ... RED = auto() ... GREEN = auto() ... BLUE = auto() ... >>> EjectFlag(2**2 + 2**4) 20
- KEEP¶
Значения вне диапазона сохраняются, и членство в
Flagтакже сохраняется. Это поведение по умолчанию дляIntFlag:>>> from enum import Flag, KEEP, auto >>> class KeepFlag(Flag, boundary=KEEP): ... RED = auto() ... GREEN = auto() ... BLUE = auto() ... >>> KeepFlag(2**2 + 2**4) <KeepFlag.BLUE|16: 20>
Добавлено в версии 3.12.
- class enum.EnumDict¶
EnumDict является подклассом
dict, который используется в качестве пространства имен для определения классов перечислений (см. Подготовка пространства имен класса). Он предоставляется для поддержки подклассовEnumTypeс расширенным поведением, например, с несколькими значениями на одного члена. Его следует вызывать с именем создаваемого класса перечисления, в противном случае частные имена и внутренние классы будут обрабатываться некорректно.Обратите внимание, что переопределяется только интерфейс
MutableMapping(__setitem__()иupdate()). Возможно обойти проверки с помощью других операцийdict, например|=.- member_names¶
Список имен членов.
Добавлено в версии 3.13.
Поддерживаемые __dunder__ имена¶Supported __dunder__ names
__members__ представляет собой упорядоченное отображение только для чтения элементов member_name:member.
Оно доступно только на уровне класса.
__new__(), если указан, должен создавать и возвращать члены перечисления;
также настоятельно рекомендуется соответствующим образом задать _value_ элемента.
После создания всех членов он больше не используется.
Поддерживаемые _sunder_ имена¶Supported _sunder_ names
_name_– имя члена_value_– значение члена; может быть задано в__new___missing_()– функция поиска, используемая, когда значение не найдено; может быть переопределена_ignore_– список имен, представленный в видеlistилиstr, которые не будут преобразованы в члены и будут удалены из итогового класса_order_– больше не используется, сохранено для обратной совместимости (атрибут класса, удаляется при создании класса)_generate_next_value_()– используется для получения подходящего значения для члена перечисления; может быть переопределен_add_alias_()– добавляет новое имя как псевдоним для существующего члена._add_value_alias_()– добавляет новое значение как псевдоним для существующего члена.Хотя имена
_sunder_обычно зарезервированы для дальнейшего развития классаEnumи не могут использоваться, некоторые явно разрешены:_repr_*(например,_repr_html_), как используется в расширенном отображении IPython
Добавлено в версии 3.6: _missing_, _order_, _generate_next_value_
Добавлено в версии 3.7: _ignore_
Добавлено в версии 3.13: _add_alias_, _add_value_alias_, _repr_*
Утилиты и декораторы¶Utilities and decorators
- class enum.auto¶
auto можно использовать вместо значения. При использовании механизм Enum вызовет
Enum._generate_next_value_(), чтобы получить подходящее значение. ДляEnumиIntEnumподходящим значением будет наибольшее из уже использованных плюс один; дляFlagиIntFlag– первая степень двойки, превышающая наибольшее использованное значение; дляStrEnum– версия имени элемента в нижнем регистре. Следует соблюдать осторожность при смешивании auto() с явно указанными значениями.Экземпляры auto разрешаются только на верхнем уровне присваивания, отдельно или как часть кортежа:
FIRST = auto()будет работать (auto() заменяется на1);SECOND = auto(), -2будет работать (auto заменяется на2, поэтому2, -2используется для создания элемента перечисленияSECOND;THIRD = [auto(), -3]не будет работать ([<auto instance>, -3]используется для создания элемента перечисленияTHIRD)
Изменено в версии 3.11.1: В предыдущих версиях
auto()должен был быть единственным на строке присваивания, чтобы работать правильно._generate_next_value_можно переопределить, чтобы настроить значения, используемые auto.Примечание
В версии 3.13 значение по умолчанию
_generate_next_value_всегда будет возвращать наибольшее значение элемента, увеличенное на 1, и будет завершаться ошибкой, если какой-либо элемент имеет несовместимый тип.
- @enum.property¶
Декоратор, похожий на встроенный
@property, но предназначенный специально для перечислений. Он позволяет атрибутам элементов иметь те же имена, что и сами элементы.Примечание
Декоратор property и элемент должны быть определены в разных классах; например, атрибуты value и name определены в классе Enum, а подклассы Enum могут определять элементы с именами
valueиname.Добавлено в версии 3.12.
- @enum.unique¶
Декоратор
class, специально предназначенный для перечислений. Он просматривает__members__перечисления, собирая все найденные псевдонимы; если какие-либо найдены, вызываетсяValueErrorс подробностями:>>> from enum import Enum, unique >>> @unique ... class Mistake(Enum): ... ONE = 1 ... TWO = 2 ... THREE = 3 ... FOUR = 3 ... Traceback (most recent call last): ... ValueError: duplicate values found in <enum 'Mistake'>: FOUR -> THREE
- @enum.verify¶
Декоратор
class, специально предназначенный для перечислений. Элементы изEnumCheckиспользуются для указания, какие ограничения должны проверяться в декорированном перечислении.Добавлено в версии 3.12.
- @enum.member¶
Декоратор для использования в перечислениях: его цель станет элементом.
Добавлено в версии 3.12.
- @enum.nonmember¶
Декоратор для использования в перечислениях: его цель не станет элементом.
Добавлено в версии 3.12.
- @enum.global_enum¶
Декоратор, изменяющий
str()иrepr()перечисления, чтобы показывать его элементы как принадлежащие модулю, а не классу. Должен использоваться только когда элементы перечисления экспортируются в глобальное пространство имён модуля (см. примерre.RegexFlag).Добавлено в версии 3.12.
- enum.show_flag_values(value)¶
Возвращает список всех целых чисел, являющихся степенями двойки, содержащихся в значении флага.
Добавлено в версии 3.12.
- enum.bin(num, max_bits=None)¶
Как встроенная
bin(), за исключением того, что отрицательные значения представляются в dополнительном коде, и старший бит всегда указывает знак (0означает положительное,1– отрицательное).>>> import enum >>> enum.bin(10) '0b0 1010' >>> enum.bin(~10) # ~10 is -11 '0b1 0101'
Добавлено в версии 3.12.
Примечания¶Notes
Эти три типа перечислений предназначены для прямой замены существующих целочисленных и строковых значений; поэтому у них есть дополнительные ограничения:
__str__использует значение, а не имя элемента перечисления
__format__, поскольку он использует__str__, также будет использовать значение элемента перечисления, а не его имяЕсли эти ограничения не нужны или нежелательны, можно либо создать свой собственный базовый класс, смешав в нём типы
intилиstr:>>> from enum import Enum >>> class MyIntEnum(int, Enum): ... passили можно переназначить соответствующее
str()и т.д. в своём перечислении:>>> from enum import Enum, IntEnum >>> class MyIntEnum(IntEnum): ... __str__ = Enum.__str__