В большинстве современных языках программирования поддерживается работа с перечислениями и 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, то интерпретатор вызовет ошибку, если несколько элементов перечисления имеют одно и то же значение.
- Элементы перечислений не поддерживают операции сравнения «>» или «<«.
Программист может создать подкласс от перечисления только если в нём не определён ни один элемент, иначе интерпретатор возбуждает исключение.
Все о Python