Dataclasses и Pydantic
| dataclasses | стандартная библиотека, PEP 557, Python 3.7 (2018) |
|---|---|
| Автор dataclasses | Эрик Смит |
| Pydantic | Сэмюэл Колвин, с 2017 |
| Pydantic v2 | 2023, ядро pydantic-core на Rust |
| Лицензия Pydantic | MIT |
| Предшественник и альтернатива | attrs (2015), msgspec |
| Используют Pydantic | FastAPI, LangChain, SDK многих API |
dataclasses — модуль стандартной библиотеки Python, который по аннотациям полей автоматически генерирует для класса конструктор __init__, строковое представление __repr__, сравнение __eq__ и другие служебные методы. Pydantic — сторонняя библиотека, которая по тем же аннотациям типов проверяет и преобразует данные во время выполнения: строку "42" из JSON превращает в число, а некорректный email отвергает с понятной ошибкой.
Проще говоря, dataclass описывает структуру данных внутри программы, а Pydantic охраняет границу, через которую в программу приходят данные извне: HTTP-запросы, файлы конфигурации, ответы API и языковых моделей.
dataclasses
Модуль появился в Python 3.7 (PEP 557, 2018); автор — Эрик Смит, вдохновлялся сторонней библиотекой attrs.[1][6]
from dataclasses import dataclass, field
@dataclass(slots=True, kw_only=True)
class Order:
id: int
customer: str
items: list[str] = field(default_factory=list) # изменяемое значение — только через фабрику
paid: bool = False
@property
def size(self) -> int:
return len(self.items)
o = Order(id=1, customer="Алиса", items=["книга"])
print(o) # Order(id=1, customer='Алиса', items=['книга'], paid=False)
print(o == Order(id=1, customer="Алиса", items=["книга"])) # True
Основные параметры декоратора:[2]
| Параметр | Действие |
|---|---|
frozen=True |
неизменяемые экземпляры, пригодные как ключи словаря |
slots=True |
__slots__: меньше памяти, быстрее доступ к атрибутам (3.10+) |
kw_only=True |
все поля только именованными аргументами (3.10+) |
order=True |
сравнение <, > по полям |
Dataclass не проверяет типы: Order(id="один", customer=None) создастся без ошибок — несоответствие найдёт только статический анализатор (mypy и pyright). Для валидации есть метод __post_init__, но для сложных правил удобнее Pydantic.
Pydantic
Сэмюэл Колвин выпустил Pydantic в 2017 году. Библиотека стала стандартом валидации данных в Python благодаря FastAPI, который построил на ней обработку запросов. Pydantic v2 (2023) переписал ядро на Rust (pydantic-core), ускорив валидацию в разы; при переходе изменилась часть API.[4]
from datetime import datetime
from pydantic import BaseModel, EmailStr, Field, ValidationError
class User(BaseModel):
id: int
email: EmailStr # требует пакет email-validator
name: str = Field(min_length=1, max_length=100)
tags: list[str] = []
created_at: datetime
data = {"id": "42", "email": "alice@example.com", "name": "Алиса",
"created_at": "2026-11-09T10:00:00Z"}
user = User.model_validate(data) # "42" → 42, строка → datetime
print(user.model_dump_json()) # обратно в JSON
try:
User.model_validate({"id": "x", "email": "нет", "name": "", "created_at": "вчера"})
except ValidationError as e:
print(e.error_count(), "ошибки") # все ошибки сразу, с путями к полям
Возможности:[3]
- Приведение типов в нестрогом режиме и строгий режим, где
"42"дляint— ошибка. - Валидаторы полей и моделей (
@field_validator,@model_validator) для своих правил. - Вложенные модели, списки и словари моделей, объединения типов с дискриминатором.
- JSON Schema по модели — основа документации OpenAPI в FastAPI и описаний инструментов для языковых моделей (см. Tool use / function calling, Структурированный вывод (JSON mode)).
- Настройки приложения — пакет pydantic-settings читает конфигурацию из переменных окружения и файлов
.envс проверкой типов.[5] - Проверка обычных dataclass — декоратор
pydantic.dataclasses.dataclassиTypeAdapterдля любых типов.
Сравнение
| dataclasses | Pydantic | attrs | |
|---|---|---|---|
| Где | стандартная библиотека | сторонняя | сторонняя |
| Проверка во время выполнения | нет | да, с приведением типов | по желанию (валидаторы) |
| Сериализация в JSON | вручную (asdict) |
встроена | через cattrs |
| JSON Schema | нет | да | нет |
| Скорость создания объектов | высокая | ниже (идёт проверка) | высокая |
| Типичное применение | внутренние структуры | данные извне, API, конфигурация | внутренние структуры с расширенными возможностями |
Для максимальной скорости сериализации и проверки существует msgspec, а для схем в базе данных — ORM-модели вроде SQLAlchemy или SQLModel (гибрид SQLAlchemy и Pydantic).
Как выбирать
- Данные создаёт сам код и им можно доверять — dataclass: без зависимостей и накладных расходов.
- Данные приходят снаружи — запросы, JSON, YAML, ответы LLM, переменные окружения — Pydantic на границе системы; внутрь передаются уже проверенные объекты.
- Не стоит проверять одни и те же данные на каждом слое: валидация на входе, дальше — обычные типизированные объекты.