Функция enum auto() в Python — как работает

В этом руководстве вы узнаете, как работает функция enum auto() в Python для получения уникальных значений для членов перечисления.

Что такое функция enum auto() в Python?

В следующем примере определяется перечисление с тремя членами, значениями которых являются 1, 2 и 3:

from enum import Enum


class State(Enum):
    PENDING = 1
    FULFILLED = 2
    REJECTED = 3

В этом примере мы вручную присваиваем целочисленные значения членам перечисления.

Чтобы сделать его более удобным, в Python 3.6 в модуле enum появился вспомогательный класс auto(), который автоматически генерирует уникальные значения для членов перечисления. Например:

from enum import Enum, auto


class State(Enum):
    PENDING = auto()
    FULFILLED = auto()
    REJECTED = auto()

    def __str__(self):
        return f'{self.name(self.value)}'

Как это работает.

  • Сначала импортируйте классы Enum и auto из модуля enum.
  • Во-вторых, вызовите auto(), чтобы сгенерировать уникальное значение для каждого члена перечисления State.

По умолчанию класс auto() генерирует последовательность целых чисел, начиная с 1.

Ниже показаны значения членов перечисления State:

for state in State:
    print(state.name, state.value)

Выход:

PENDING 1
FULFILLED 2
REJECTED 3

Как работает enum auto()

Технически, auto() вызывает метод _generate_next_value_() для генерации значений для членов. Вот синтаксис метода _generate_next_value_():

_generate_next_value_(name, start, count, last_values)

_generate_next_value_() имеет следующие параметры:

  • name — это имя участника;
  • start — начальное значение членов перечисления;
  • count — это количество созданных членов перечисления, включая псевдонимы;
  • Last_values — это список всех предыдущих значений, используемых для членов перечисления.

По умолчанию _generate_next_value_() генерирует следующее число в последовательности целых чисел, начиная с единицы. Однако Python может изменить эту логику в будущем.

Можно переопределить метод _generate_next_value_(), чтобы добавить собственную логику, генерирующую уникальные значения. Если это так, вам необходимо разместить метод _generate_next_value_() перед определением всех членов.

Ниже показано, как переопределить метод _generate_next_value_() для генерации значений для членов, используя их имена:

from enum import Enum, auto


class State(Enum):
    def _generate_next_value_(name, start, count, last_values):
        return name.lower()

    PENDING = auto()
    FULFILLED = auto()
    REJECTED = auto()


for state in State:
    print(state.name, state.value)

Выход:

PENDING pending
FULFILLED fulfilled
REJECTED rejected
Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *