Вопрос с собеседования · Python

Чем 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 с дополнительными возможностями

Подробно

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 проверит типы.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗dataclass проверяет типы полей при создании, а Pydantic — нет
  • ✗namedtuple — изменяемый класс с генерацией __init__
  • ✗Pydantic не умеет сериализовать модели в JSON
  • ✓dataclass не проверяет типы; Pydantic проверяет и преобразует данные

Разбор темы

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

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования