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