На этом шаге мы рассмотрим особенности использования перечислений.
Перечисление - это определенный самим программистом набор каких-либо именованных значений. Обычно они применяются для того, чтобы дать понятные имена каким-либо значениям, используемым в коде программы, - например, кодам ошибок, возвращаемым функциями Windows API.
Инструменты для создания перечислений появились в Python 3.4. Это два класса, определенные в модуле Enum:
from enum import Enum class Versions(Enum): V2_7 = "2.7" V3_4 = "3.4"
Здесь мы определили класс-перечисление Versions, имеющий два элемента: V2_7 со значением "2.7" и V3_4 со значением "3.4". Отметим, что элементы перечислений представляют собой атрибуты объекта класса;
from enum import IntEnum class Colors(IntEnum): Red = 1 Green = 2 Blue = 3
Определяем перечисление Colors с тремя элементами, хранящими целые числа.
Имена элементов перечислений должны быть уникальны (что и неудивительно - ведь фактически это атрибуты объекта класса). Однако разные элементы все же могут хранить одинаковые значения:
from enum import Enum class Versions(Enum): V2_7 = "2.7" V3_4 = "3.4" MostFresh = "3.4"
Чтобы объявить, что наше перечисление может хранить лишь уникальные значения, мы можем использовать декоратор unique, также определенный в модуле enum:
from enum import Enum, unique @unique class Versions(Enum): V2_7 = "2.7" V3_4 = "3.4"
Если мы попытаемся определить в классе, для которого был указан декоратор unique, элементы с одинаковыми значениями, то получим сообщение об ошибке.
Определив перечисление, можно использовать его элементы в вычислениях:
>>> e = Versions.V3_4 >>> e <Versions.V3_4: '3.4'> >>> e.value '3.4' >>> e == Versions.V2_7 False
Отметим, что для этого нам не придется создавать экземпляр класса. Это сделает сам Python, неявно создав экземпляр с тем же именем, что мы дали классу (вся необходимая для этого функциональность определена в базовых классах перечислений Enum и IntEnum).
Все классы перечислений принадлежат типу EnumMeta из модуля enum:
>>> type (Colors) <class 'enum.EnumMeta'> >>> from enum import EnumMeta >>> type (Colors) == EnumMeta True
Однако элементы перечислений уже являются экземплярами их классов:
>>> type (Colors.Red) <enum 'Colors'> >>> type (Colors.Red) == Colors True
На следующем шаге мы закончим изучение этого вопроса.