Рубрики
Без рубрики

Python 3: введение в перечисления

Получите практические, реальные навыки Python на наших ресурсах и пути

Автор оригинала: Mike Driscoll.

Python добавил enum Модуль к стандартной библиотеке в версии 3.4. Python Документация описывает enum, как это:

Перечисление является набором символических имен (членов), связанных с уникальными, постоянными значениями. В пределах перечисления члены могут сравниться с идентичностью, а сама перечисление может быть передано.

Давайте посмотрим, как вы можете создать объект Enum:

>>> from enum import Enum
>>> class AnimalEnum(Enum):
        HORSE = 1
        COW = 2
        CHICKEN = 3
        DOG = 4
>>> print(AnimalEnum.CHICKEN)
AnimalEnum.CHICKEN
>>> print(repr(AnimalEnum.CHICKEN))

Здесь мы создаем класс перечисления под названием Animaleenum Отказ Внутри класса мы создаем атрибуты класса, называемые Пользователи перечисления которые являются константами. Когда вы пытаетесь распечатать элемент Enum, вы просто вернетесь ту же строку. Но если вы распечатаете репре члена enum вы получите член Enum и его значение.

Если вы попытаетесь изменить элемент Enum, Python поднимет AttributeError :

>>> AnimalEnum.CHICKEN = 5
Traceback (most recent call last):
  Python Shell, prompt 5, line 1
  File "C:\Users\mike\AppData\Local\Programs\PYTHON\PYTHON36-32\Lib\enum.py", line 361, in __setattr__
    raise AttributeError('Cannot reassign members.')
builtins.AttributeError: Cannot reassign members.

Участники Enum имеют некоторые свойства, которые вы можете использовать, чтобы получить их имя и значение:

>>> AnimalEnum.CHICKEN.name
'CHICKEN'
>>> AnimalEnum.CHICKEN.value
3

Перечисления также поддерживают итерацию. Таким образом, вы можете сделать что-то весело, как это:

>>> for animal in AnimalEnum:
        print('Name: {}  Value: {}'.format(animal, animal.value))

Name: AnimalEnum.HORSE  Value: 1
Name: AnimalEnum.COW  Value: 2
Name: AnimalEnum.CHICKEN  Value: 3
Name: AnimalEnum.DOG  Value: 4

Перечисления Python не позволяют создавать элементы Enum с тем же именем:

>>> class Shapes(Enum):
...     CIRCLE = 1
...     SQUARE = 2
...     SQUARE = 3
... 
Traceback (most recent call last):
  Python Shell, prompt 13, line 1
  Python Shell, prompt 13, line 4
  File "C:\Users\mike\AppData\Local\Programs\PYTHON\PYTHON36-32\Lib\enum.py", line 92, in __setitem__
    raise TypeError('Attempted to reuse key: %r' % key)
builtins.TypeError: Attempted to reuse key: 'SQUARE'

Как видите, когда вы пытаетесь повторно использовать имя члена Enum, он поднимет Типеррор Отказ

Вы также можете создать enum, как это:

>>> AnimalEnum = Enum('Animal', 'HORSE COW CHICKEN DOG')
>>> AnimalEnum

>>> AnimalEnum.CHICKEN

Лично я думаю, что это действительно аккуратно!

Enum Access

Интересно достаточно, есть несколько способов доступа к членам Enum. Например, если вы не знаете, какой enum какой, вы можете просто вызвать enum напрямую и пропустить его значение:

>>> AnimalEnum(2)

Если вы проходите в неверном значении, то Python поднимает ValueError.

>>> AnimalEnum(8)
Traceback (most recent call last):
  Python Shell, prompt 11, line 1
  File "C:\Users\mike\AppData\Local\Programs\PYTHON\PYTHON36-32\Lib\enum.py", line 291, in __call__
    return cls.__new__(cls, value)
  File "C:\Users\mike\AppData\Local\Programs\PYTHON\PYTHON36-32\Lib\enum.py", line 533, in __new__
    return cls._missing_(value)
  File "C:\Users\mike\AppData\Local\Programs\PYTHON\PYTHON36-32\Lib\enum.py", line 546, in _missing_
    raise ValueError("%r is not a valid %s" % (value, cls.__name__))
builtins.ValueError: 8 is not a valid AnimalEnum

Вы также можете получить доступ к перечислению по имени:

>>> AnimalEnum['CHICKEN']

Enum niceties.

Модуль Enum также имеет пару других забавных вещей, которые вы можете импортировать. Например, вы можете создавать автоматические значения для ваших перечислений:

>>> from enum import auto, Enum
>>> class Shapes(Enum):
        CIRCLE = auto()
        SQUARE = auto()
        OVAL = auto() 
>>> Shapes.CIRCLE

Вы также можете импортировать Handy Enum Decorator, чтобы убедиться, что ваши члены перечисления являются уникальными:

>>> @unique
    class Shapes(Enum):
        CIRCLE = 1
        SQUARE = 2
        TRIANGLE = 1
 
Traceback (most recent call last):
  Python Shell, prompt 18, line 2
  File "C:\Users\mike\AppData\Local\Programs\PYTHON\PYTHON36-32\Lib\enum.py", line 830, in unique
    (enumeration, alias_details))
builtins.ValueError: duplicate values found in : TRIANGLE -> CIRCLE

Здесь мы создаем перечисление, которое имеет два члена, пытаясь отображать то же значение. Потому что мы добавили @Unique Декоратор, ValueError поднят, если есть какие-либо дубликаты значений в элементах Enum. Если у вас нет @Unique Декоратор наносится, тогда вы можете иметь элементы Enum с одинаковым значением.

Обертывание

Хотя я не думаю, что модуль Enum действительно необходим для Python, это аккуратный инструмент для доступов. Документация имеет гораздо больше примеров и демонстрирует другие типы врач, поэтому он определенно стоит прочитать.

Дальнейшее чтение