Синтаксис Python: enum, перечисления

Программист время от времени сталкивается с необходимостью ограничить множество допустимых значений для некоторого типа данных. Например, день недели это 7 различных значений, а месяцев у нас 12. Для удобного хранения подобных данных придуманы перечисления - enum.

Стандартная реализация enum появилась в Python начиная с версии 3.4 ( PEP 435. До этого ее легко заменяли словарями.

Реализация представлена модулем enum. Модуль содержит несколько классы Enum, IntEnum (константы могут иметь только тип int) и декоратор unique, который проверяет ваш набор констант на дубликаты.

Для версий Python отличных от 3.4 - установите модуль enum34, например, с помощью pip - pip install enum34

Перечисление в классическом виде — это просто набор констант, принадлежащих к одному и тому же типу.

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

Использование enum в Python выглядит так:

from enum import Enum
Animal = Enum('Animal', 'ant bee cat dog')
# что почти одно и тоже:
class Animal(Enum):
    ant = 1
    bee = 2
    cat = 3
    dog = 4
print(Animal.ant)
# <Animal.ant: 1>

Эти константы можно сравнивать

>>> Animal.ant == Animal.ant
True
>>> Animal.ant == Animal.bee
False

Но не стоит думать, что хранением чисел все ограничилось. Рассмотрим небольшой пример хранения углов для сторон света (сперто):

from collections import namedtuple
import enum

# Данные, связанные с перечислением WorldSide
_ = namedtuple('WorldSideInfo', ['angle', 'mode'])

class WorldSide(enum.Enum):
    """Класс перечисления определяет стороны света"""

    North = _(90, (0, 0, 0))
    NorthEast = _(45, (2, 1, 1))
    East = _(0, (0, 0, 0))
    SouthEast = _(-45, (2, 1, 1))
    South = _(-90, (0, 0, 0))
    SouthWest = _(-135, (2, 1, 1))
    West = _(180, (0, 0, 0))
    NorthWest = _(135, (2, 1, 1))


# Используем
ws_angle = WorldSide.NorthWest.value.angle

Мысли об роли Enum в Python можно почитать по ссылкам:

Еще интересно как раньше пытались реализовать логику enum'ов:

Рейтинг
Текущий рейтинг: 4


Комментарии

Python-конференция

Теги

notify, os, isinstance, encode, database, all, многопоточность, mail, срез, сборник, pytest, новый год, конкурентность, аргумент, pycon, gevent, GIL, интерпретатор, python проект, игры, замыкание, copy, функциональное программирование, pynotify, pypi, типы данных, csv, график, testing, поиск ошибок, автоматизация, ardruio, swagger, память, файл, pip, тест, web, статический анализ, dsl, syntax, отчет, список, ide, графика, notification, rest, pycallgraph, githook, generic, hook. webhook, история, asyncio, logging, инструмент, swig, click, crawler, while, aiohttp, clonedigger, оптимизация, трансдьюсер, matplotlib, Бизли, bottle, концепция, типизация, fuzzy-testing, урок, language, путь, nose, image, тестирование, консоль, vk, c, list, operator, pylint, print, практика, сравнение, functools, измерение, польза, selenium, сопроцедуры, генерация данных, БД, мастер класс, plotly, tests, bokeh, генерация, производительность, winapi, flask, typing, strip, lxml, grab, scandir, Qt, pycharm, проект, книга, dictwriter, coverage, html, фп, pypy, signal, стандартная библиотека, now, weakref, google, практика программирования, corotine, sqlalchemy, nameko, синтаксис, import, паттер, virtualenv, api, зеленый поток, timeit, контекст, бд, funcy, encoding, кэш, json, статистика, байт-код, unittest, кодировка, opencv, datetime, ооп, itertools, package, fp, mixin, python, assert, pyqt, утка, garbage collector, курс, frozenset, numpy, django-debug-toolbar, терминал, xpath, closure, type, дубликат, requirements, статическая типизация, PIL, работа, debug, быстродействие, plot, рейтинг, водяной знак, ip, python3, yield from, видео, test, fuzzy, curses, gitter, unicode, decode, cache, twitter, pep, вконтакте, операционная система, ОС, тесты, any, awesome, задача, последовательность, geoip, ошибки, генератор, hardcore, toolbar, Wx, qt, магия, doctest, железо, marshal, множество, сигнал, greenlet, слайс, future, db, время, admin, pyside, regex, module, slots, примесь, sys, email, action, requirementstxt, регулярные выражения, дубликат кода, одноплатный компьютер, scrapinghub, micropython, фича, mock, raspberry pi, foreign key, ссылка, django, нг, pickle, модуль, celery, справочник, импорт, лямбда, rpc, with, наука, jinja2, log, обработка текста, super, set, svg, матрица, pygame, fixture, docstring, fabric, декларативный язык, пакет, опыт, магическая переменная, regexp, Гвидо, slice, gui, база данных, vkcom, юникод, yattag, ospath, cython, unit, maxmind, матан, документация, анализатор, Tags, менеджер контекста, yield, учебник, real-time, слабая ссылка, IPython, браузер, xml, GUI, gc, channel, машинное обучение, zip, библиотека, ошибка, данные, оповещение, парсинг, изображение, CLI, tox, фильтр, R, feedly, cffi, http, таблицы, python2, gunicorn, стандарт, if, requests, rss, tkinter, time, mechanize, gensim, интерфейс, enum, визуализация, postgresql, web parsing, язык, исключение, архитектура, lstrip, parsing, путь до файла, copy paste, multiprocessing, rstrip, статический анализатор, lambda