822просмотров
32.7%от подписчиков
23 февраля 2026 г.
questionScore: 904
Вы до сих пор используете в проекте "магические" строки?😖
@dataclass
class Task: status: str ... def create_pending_task(data: dict) -> Task: task = Task(data) task.status = "pending" # < магическая строка return task
Где тут проблема? 🔸 Если "pending" изменится на "wait", вам придется искать это слово по всему проекту
🔸 Напишете panding вместо pending и баг вылезет только в рантайме в непредсказуемом месте
🔸 Вам очень повезет, если в проекте нет такой же строки но с другим смыслом Как делать правильно? Используем модуль enum
from enum import StrEnum class TaskStatus(StrEnum): PENDING = "pending" RUNNING = "running" COMPLETED = "completed" @dataclass
class Task: status: TaskStatus ... def create_pending_task(data: dict) -> Task: task = Task(data) task.status = TaskStatus.PENDING return task Почему это лучше:
▫️Теперь это не строка а объект
▫️ IDE сможет подсказать какие статусы существуют, вам не нужно лезть в документацию или базу
▫️ Единый источник истины. Изменяем в одном месте вместо поиска на всему проекту
▫️ Типизация - наше всё, mypy умеет с этим работать
▫️ Читаемость кода повышается. Ведь читаем мы его чаще чем пишем
▫️ Автоматическая валидация допустимых значений в моделях Pydantic #tricks