В этой статье будет рассмотрена статья по использованию объектов Enum в Python. Перечисление или класс «enumeration» позволяют создавать уникальные константы, значение которых остается неизменным в программах и приложениях Python. Все примеры кода в этой статье протестированы с Python 3.9.5 в Ubuntu 21.04.
О объектах Enums в Python
Как указывалось ранее, перечисления – это объекты, имеющие постоянные значения. У них есть символические или репрезентативные имена, прикрепленные к их соответствующим значениям. Они похожи на другие переменные Python, но обладают некоторыми уникальными функциями, такими как типобезопасные объекты и группировка. В Python перечисления всегда представлены с использованием символов верхнего регистра, чтобы указать, что они имеют постоянные значения. Перечисления особенно полезны в случаях, когда у вас есть предопределенный диапазон возможных значений, и вам нужно выбирать и ссылаться на ограниченный выбор в логике вашей программы. Использование Enums в Python можно лучше понять на примерах. Некоторые из них описаны ниже.
Создание перечислений
Вы можете создавать перечисления, создав новый класс, наследующий сам класс Enum. Взгляните на пример кода ниже:
from enum import Enum class Color(Enum): YELLOW = 1 BLACK = 2 WHITE = 3 PURPLE = 4 ORANGE = 5 print (Color(1)) print (repr(Color(1))) print (Color.YELLOW) print (type(Color.YELLOW)) print (Color.YELLOW.name) print (Color.YELLOW.value)
Первый оператор импортирует класс Enum из модуля enum. Затем создается новый класс под названием «Color» путем наследования класса Enum. Затем создаются некоторые переменные (члены перечисления) с постоянными значениями. Эти переменные представляют пять возможных вариантов. Следующие несколько операторов печати показывают, как вы можете получить доступ к этим перечислениям, их именам и значениям. Эти утверждения говорят сами за себя. Чтобы получить доступ к возможному выбору перечисления, вы можете использовать точечную нотацию или указать известное значение в качестве аргумента класса. После выполнения приведенного выше примера кода вы должны получить следующий результат:
Color.YELLOW Color.YELLOW YELLOW 1
Как видно из выходных данных, есть множество способов получить доступ к членам перечисления. Обратите внимание, что вызов функции печати для перечисления вернет его удобочитаемую строковую форму, а не значение. Таким образом, обращение к Color.YELLOW вернет Color.YELLOW, а не 1.
Итерация по перечислениям
Вы можете перебирать объект типа перечисления и получать его члены с помощью операторов цикла.
from enum import Enum class Color(Enum): YELLOW = 1 BLACK = 2 WHITE = 3 PURPLE = 4 ORANGE = 5 for c in Color: print (c.name, c.value)
Используя переменную «c», вы можете получить доступ к каждому члену объекта типа перечисления Color. После выполнения приведенного выше примера кода вы должны получить следующий результат.
YELLOW 1 BLACK 2 WHITE 3 PURPLE 4 ORANGE 5
Имя членов перечисления должно быть уникальным, но допускаются повторяющиеся значения
Вы не можете создать два члена перечисления с одним и тем же именем, но их значения не имеют таких ограничений. Следующий пример кода вызовет ошибку, поскольку есть два члена перечисления с одинаковыми именами.
from enum import Enum class Color(Enum): BLACK = 1 BLACK = 2 WHITE = 3 PURPLE = 4 ORANGE = 5
После выполнения приведенного выше примера кода вы должны получить примерно такую ошибку:
File "/usr/lib/python3.9/enum.py", line 133, in __setitem__ raise TypeError('Attempted to reuse key: %r' % key) TypeError: Attempted to reuse key: 'BLACK'
Как вы можете видеть в выходных данных, повторяющиеся имена не допускаются для членов перечисления. Однако следующий код действителен, если два члена перечисления имеют одинаковые значения.
from enum import Enum class Color(Enum): YELLOW = 2 BLACK = 2 WHITE = 3 PURPLE = 4 ORANGE = 5
Если вы также хотите принудительно установить уникальные значения для членов перечисления вместе с их именами, вы можете использовать «уникальный» декоратор для предотвращения дублирования значений.
from enum import Enum, unique @unique class Color(Enum): YELLOW = 2 BLACK = 2 WHITE = 3 PURPLE = 4 ORANGE = 5
Декоратор «@unique» заставляет объекты типа перечисления выдавать ошибку, когда есть повторяющиеся значения, присвоенные членам перечисления. После выполнения приведенного выше примера кода вы должны получить следующий результат:
File "/usr/lib/python3.9/enum.py", line 989, in unique raise ValueError('duplicate values found in %r: %s' % ValueError: duplicate values found in : BLACK -> YELLOW
Автоматическое присвоение значений членам перечисления
Если значения членов перечисления не имеют для вас значения, вы можете использовать метод «auto», доступный в модуле перечисления, для автоматического присвоения последовательных номеров членам перечисления.
from enum import Enum, auto class Color(Enum): YELLOW = auto() BLACK = auto() WHITE = auto() PURPLE = auto() ORANGE = auto() for c in Color: print (c.name, c.value)
Как вы можете видеть в приведенном выше примере кода, вместо явного присвоения некоторых значений членам перечисления при создании каждого члена вызывалась функция auto. Метод auto всегда назначает 1 в качестве первого значения. После выполнения приведенного выше примера кода вы должны получить следующий результат:
YELLOW 1 BLACK 2 WHITE 3 PURPLE 4 ORANGE 5
Заключение
Объекты типа Enums в Python позволяют создавать переменные постоянного стиля с уникальными именами. Эти переменные, обычно называемые членами перечисления, могут быть представлены читаемыми строками. Перечисления особенно полезны, когда вы хотите выбрать один или несколько вариантов из группы ограниченных вариантов.