Ответ вслух Middle ООП и dataclasses обновлено

dataclass, NamedTuple или Pydantic

Вопрос

Когда вы выбираете dataclass, NamedTuple, Pydantic-модель или обычный класс?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Образцовый ответ: «Для внутренних структур данных беру dataclass: он генерирует init, repr, eq, а с frozen=True и slots=True даёт неизменяемые компактные объекты. Типы в аннотациях он не проверяет, это только подсказки.

Что должно прозвучать в ответе

  • dataclass: внутренние структуры данных без валидации, генерирует init/repr/eq

  • NamedTuple: неизменяемая запись, совместимая с кортежем, распаковка

  • Pydantic: валидация и преобразование внешних данных (API, конфиги)

  • Обычный класс: богатое поведение, инварианты, нестандартная инициализация

  • frozen/slots ради неизменяемости и памяти

Что могут спросить следом

  • Проверяет ли dataclass типы полей?
  • Как сделать вычисляемое поле в dataclass?

Разбор

Образцовый ответ: «Для внутренних структур данных беру dataclass: он генерирует __init__, __repr__, __eq__, а с frozen=True и slots=True даёт неизменяемые компактные объекты. Типы в аннотациях он не проверяет, это только подсказки. NamedTuple беру, когда нужна неизменяемая запись, которая ведёт себя как кортеж: распаковка, индексы, совместимость со старым кодом, возвращающим кортежи. Для данных, приходящих снаружи, из запроса, конфига, очереди, беру Pydantic: он валидирует и приводит типы, даёт понятные ошибки и сериализацию, на нём построен FastAPI. Обычный класс пишу, когда у объекта много поведения и инвариантов, сложная инициализация или нужен контроль над атрибутами. Для вычисляемых полей в dataclass есть field(init=False) и __post_init__».

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме