Чем dataclass отличается от namedtuple и Pydantic-модели?
- Что генерирует @dataclass?
- Как сделать неизменяемый класс данных в Python?
@dataclass генерирует __init__, __repr__, __eq__ (опционально порядок, хеш, слоты) по аннотированным полям — обычный изменяемый класс без проверки типов. namedtuple — неизменяемый кортеж с именами полей, индексируется и распаковывается. Pydantic — валидация и преобразование входных данных во время выполнения, сериализация в JSON.
- frozen=True — неизменяемость и хеш; slots=True — экономия памяти (3.10)
- Изменяемое значение по умолчанию — field(default_factory=list)
- Внешние данные (API, конфиги) — Pydantic; внутренние структуры — dataclass
А ещё attrs — предшественник dataclasses с дополнительными возможностями
Подробно
from dataclasses import dataclass, field
@dataclass(frozen=True, slots=True)
class Money:
amount: int
currency: str = "RUB"
@dataclass
class Cart:
items: list[str] = field(default_factory=list)
def __post_init__(self):
... # проверка инвариантов
| dataclass | namedtuple | Pydantic | |
|---|---|---|---|
| изменяемость | да (frozen — нет) | нет | да (настраивается) |
| проверка типов в рантайме | нет | нет | да, с приведением |
| память | обычный объект или слоты | кортеж | больше |
| сериализация | asdict | _asdict | model_dump, JSON |
namedtuple удобен как лёгкая запись, совместимая с кортежем (результаты функций, строки CSV), но наследование и методы неудобны; typing.NamedTuple даёт синтаксис с аннотациями.
Pydantic нужен на границе системы: тело HTTP-запроса, конфигурация, сообщения из очереди — где данные приходят непроверенными. Pydantic v2 написан на Rust и быстрый, но всё равно дороже dataclass.
Что хотят услышать
- Что генерирует dataclass и основные параметры.
- Отличия трёх вариантов.
- Выбор по месту в системе.
Частые ошибки
- Изменяемый список как значение по умолчанию поля.
- Ожидать, что dataclass проверит типы.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗dataclass проверяет типы полей при создании, а Pydantic — нет
- ✗namedtuple — изменяемый класс с генерацией __init__
- ✗Pydantic не умеет сериализовать модели в JSON
- ✓dataclass не проверяет типы; Pydantic проверяет и преобразует данные
Разбор темы
- ООП в Python — классы, свойства, наследование и dataclass
self и __init__, магические методы, property, staticmethod и classmethod, MRO и super, dataclass против namedtuple и Pydantic, ABC и Protocol, метаклассы.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.