⚖️ Старый vs Новый: валидация данных

🎯 Сравнение подходов к валидации

⚡ Кратко

  • Ручная валидация — много кода, легко забыть проверку, сложно поддерживать.
  • Pydantic — декларативная валидация через аннотации типов. Меньше кода, больше надёжности.
  • Pydantic v1 → v2: @validator@field_validator, .dict().model_dump(), .json().model_dump_json().

Сравнение подходов

🔥 Старый способ: ручная валидация

def create_user(data: dict) -> dict:
    errors = []
    if not isinstance(data.get('name'), str):
        errors.append("name must be a string")
    if not isinstance(data.get('age'), int):
        errors.append("age must be an integer")
    if data.get('age', 0) < 0:
        errors.append("age must be positive")
    if "@" not in str(data.get('email', '')):
        errors.append("email is invalid")

    if errors:
        raise ValueError(errors)

    return {
        "name": data['name'],
        "age": data['age'],
        "email": data['email']
    }
  • ❌ Много шаблонного кода
  • ❌ Легко забыть проверить какое-то поле
  • ❌ Нет автоматического приведения типов
  • ❌ Сложно описывать вложенные структуры

✨ Новый способ: Pydantic

from pydantic import BaseModel, EmailStr

class User(BaseModel):
    name: str
    age: int
    email: EmailStr

user = User(name="Anna", age=25, email="anna@example.com")
print(user.model_dump())
  • ✅ Декларативное описание — читается как спецификация
  • ✅ Автоматическая валидация всех полей
  • ✅ Автоматическое приведение типов (например, "25" → 25)
  • ✅ Подробные сообщения об ошибках
  • ✅ Вложенные модели из коробки
  • ✅ Сериализация в JSON одним методом

Pydantic v1 vs v2

v1 (устарело)v2 (актуально)
@validator@field_validator
.dict().model_dump()
.json().model_dump_json()
.parse_raw().model_validate_json()
.parse_obj().model_validate()
__root__RootModel
Важно: в интернете много примеров на Pydantic v1. Если видишь @validator или .dict() — это старая версия. В нашем курсе используем v2.