Enum в Python

В большинстве современных языках программирования поддерживается работа с перечислениями и Python – не исключение. Программист может обойтись без них. Однако, как и многие другие инструменты, перечисления в Python упрощают написание и редактирования кода.

Что такое enum в Python

Enum — это один из модулей языка Python, с английского дословно переводится, как перечисление, что полностью отражает суть модуля.

Перечисления — это набор ограниченных неизменяемых значений, которые можно присвоить переменной. Например:

  • red = 1
  • orange = 2
  • yellow = 3

Подключение

Модуль enum является частью стандартной библиотеки Python 3, поэтому его не нужно отдельно устанавливать, достаточно подключить нужный класс с помощью команды import:

from enum import Enum

Если по какой-то причине интерпретатор Python не может найти модуль enum, установите его с помощью команды:

pip install enum

Создание

Перечисления создаются с использованием синтаксиса классов. Это упрощает их чтение и написание. Пример:

from enum import Enum
class Sequences(Enum): # Создаем класс Sequences, родительским классом 
    list = 1           # которого является класс Enum
    tuple = 2
    dict = 3
print(Sequences.list) # выводим значения
print(Sequences.tuple.name)
print(Sequences.dict.value)

В результате мы получим следующее:

Sequences.list
tuple
3

Значение элементов могут быть представлены любыми типами (str, int и другие). Структура перечисления следующая:

  • Класс Sequences — это перечисление.
  • Атрибуты Sequences.list, Sequences.tuple и другие — это элементы перечисления, которые являются функциональными константами.
  • Элементы имеют имена и значения, имя элемента Sequences.list – это “list”, а значение — “3”. К ним мы обращаемся с помощью name и value, как при выводе в консоль в примере кода, показанного выше.

Программист может не прописывать значения элементов, вместо этого он может использовать функцию auto(), которая автоматически присваивает элементу значение “1”, а каждому последующему — значение на единицу больше:

from enum import Enum, auto
class Sequences(Enum):
    list = auto()  # 1
    tuple = auto() # 1 + 1 = 2
    dict = auto()  # 2 + 1 = 3

Свойства

Поддержка итераций

Перечисления — это итерируемые объекты, это значит, что все элементы можно перебрать в цикле. Пример:

from enum import Enum
class Num(Enum):
    one = 1
    two = 2
    three = 3
for n in Num:
    print(n)

В результате выполнение в консоль выведется:

Num.one
Num.two
Num.three

Понятная человеку семантика

Одна из причин, почему программисты предпочитают перечисления массивам, заключается в понятности.

Тип элемента перечисления — это перечисление

Это значит, что перечисление является типом для всех своих элементов. То есть если программист создаст перечисление animals с элементами: cat, dog, bird. Тогда:

type(animals.cat)
<enum 'animals'>
type(animals.dog)
<enum 'animals'>
type(animals.bird)
<enum 'animals'>

Хэшируемость

Элементы перечисления хэшируемые. То есть программист может использовать их в словарях и множествах. Вспомним, что хэш позволяет создавать высокопроизводительные структуры, используя хэш-функции для сокращения объема данных.

from enum import Enum
class Color(Enum):
    BLUE = 1
    BLACK = 2
    BROWN = 3
apples = {}
apples[Color.BLUE] = 'blue'
apples[Color.BLACK] = 'black'
print(apples)

Вывод:

{<Color.BLUE: 1>: 'blue', <Color.BLACK: 2>: 'black'}

Создание методов

Программист может полностью вывести элемент перечисления, либо вывести его имя, либо вывести его значение. Для того чтобы упростить это, можно самостоятельно создать в перечислении метод. Пример:

from enum import Enum
class Students(Enum):
    IGOR = 1
    SERGEY = 2
    VASYA = 3
    def info(self):
        print("Имя - %s, значение - %s"%(self.name, self.value))
Students.IGOR.info()

Имя - IGOR, значение - 1

Таким образом код вывода сокращается в два раза. Вместо того чтобы каждый раз писать Students.элемент.name и Students.элемент.value, программист просто вызывает метод info().

Следует понимать, что это лишь маленький скрипт с перечислением из трёх элементов, в большой программе такой метод может очень значительно сократить код.

Распространённые ошибки

Работая с перечислениями программист может допустить следующие ошибки:

  • Нельзя использовать несколько элементов с одинаковыми именами, иначе интерпретатор возбудит исключение.
  • Если использовать декоратор @unique, то интерпретатор вызовет ошибку, если несколько элементов перечисления имеют одно и то же значение.
  • Элементы перечислений не поддерживают операции сравнения “>” или “<“.

Программист может создать подкласс от перечисления только если в нём не определён ни один элемент, иначе интерпретатор возбуждает исключение.