@dataclass
class Task:
status: str
...
def create_pending_task(data: dict) -> Task:
task = Task(**data)
task.status = "pending" # < магическая строка
return task
Где тут проблема?
🔸 Если
"pending" изменится на "wait", вам придется искать это слово по всему проекту🔸 Напишете
panding вместо pending и баг вылезет только в рантайме в непредсказуемом месте🔸 Вам очень повезет, если в проекте нет такой же строки но с другим смыслом
Как делать правильно?
Используем модуль
enumfrom 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