Получить доступ

Чем dataclass отличается от namedtuple и Pydantic-модели?

MiddleООПPython >=3.10
Ещё спрашивают так:
  • Что генерирует @dataclass?
  • Как сделать неизменяемый класс данных в Python?
Коротко

@dataclass генерирует __init__, __repr__, __eq__ (опционально порядок, хеш, слоты) по аннотированным полям — обычный изменяемый класс без проверки типов. namedtuple — неизменяемый кортеж с именами полей, индексируется и распаковывается. Pydantic — валидация и преобразование входных данных во время выполнения, сериализация в JSON.

  • frozen=True — неизменяемость и хеш; slots=True — экономия памяти (3.10)
  • Изменяемое значение по умолчанию — field(default_factory=list)
  • Внешние данные (API, конфиги) — Pydantic; внутренние структуры — dataclass

А ещё attrs — предшественник dataclasses с дополнительными возможностями

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

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):
        ...   # проверка инвариантов
dataclassnamedtuplePydantic
изменяемостьда (frozen — нет)нетда (настраивается)
проверка типов в рантайменетнетда, с приведением
памятьобычный объект или слотыкортежбольше
сериализацияasdict_asdictmodel_dump, JSON

namedtuple удобен как лёгкая запись, совместимая с кортежем (результаты функций, строки CSV), но наследование и методы неудобны; typing.NamedTuple даёт синтаксис с аннотациями.

Pydantic нужен на границе системы: тело HTTP-запроса, конфигурация, сообщения из очереди — где данные приходят непроверенными. Pydantic v2 написан на Rust и быстрый, но всё равно дороже dataclass.

Что хотят услышать

  • Что генерирует dataclass и основные параметры.
  • Отличия трёх вариантов.
  • Выбор по месту в системе.

Частые ошибки

  • Изменяемый список как значение по умолчанию поля.
  • Ожидать, что dataclass проверит типы.

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем