⚖️ Старый 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.