Функция 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