Скрытые фичи Enum: как выжать максимум из Python
Многие используют Enum как простой список констант. Но у enum.Enum в Python есть куда больше возможностей — и они могут сделать код чище и мощнее.
Вот несколько приёмов, которые мало кто использует — но зря.
1. Добавление поведения в Enum
from enum import Enum
class Status(Enum):
DRAFT = 'draft'
PUBLISHED = 'published'
ARCHIVED = 'archived'
def is_visible(self):
return self in {Status.DRAFT, Status.PUBLISHED}
Теперь Status.DRAFT.is_visible() — это просто и элегантно.
2. Enum с полями
from enum import Enum
class Color(Enum):
RED = ('#FF0000', 'danger')
GREEN = ('#00FF00', 'safe')
def __init__(self, hex_code, label):
self.hex_code = hex_code
self.label = label
Color.RED.hex_code # '#FF0000'
Color.RED.label # 'danger'
3. Автоматические значения с auto()
from enum import Enum, auto
class Role(Enum):
ADMIN = auto()
USER = auto()
GUEST = auto()
Удобно, если не важны конкретные значения, а нужны уникальные.
4. Строгая сериализация
В реальных приложениях (API, базы) лучше контролировать сериализацию enum'ов:
import json
class CustomEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Enum):
return obj.value
return super().default(obj)
json.dumps(Status.PUBLISHED, cls=CustomEncoder) # "published"
5. Сравнение по значению
Status('draft') == Status.DRAFT # True
Status('draft') is Status.DRAFT # True (enum гарантирует singleton)
Итого: Enum — это не просто константы. Это лёгкий способ инкапсулировать поведение и данные, улучшить читаемость и сделать код устойчивее к ошибкам.
👉 @BookPython