Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+717новых вакансий за сутки·60 871вакансия открыта сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 951
РезюмеAIПодготовкаСтатьи
ТарифыТарифы
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 391 кандидат открыт к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python9 224
  • Облачные технологии4 076
  • QA вакансии1 588
  • Android1 322
  • Инженер данных805
  • Продакт-менеджер368

Разработка

  • Backend вакансии1 317
  • iOS1 239
  • AI вакансии608
  • Fullstack вакансии523
  • Frontend вакансии456
  • Mobile вакансии28

По стеку

  • Go5 445
  • Java3 175
  • Kotlin1 119
  • Node.js1 026
  • Rust949
  • .NET666
  • PHP311
  • C#210
  • C++204

DevOps и инфраструктура

  • DevOps вакансии2 713
  • Kubernetes2 308
  • Linux-инфраструктура1 890
  • Terraform / IaC1 406
  • CI/CD842
  • Мониторинг и Observability645
  • SRE226
  • Кибербезопасность84

Аналитика и данные

  • Аналитик данных483
  • Data Scientist469
  • Бизнес-аналитик349
  • Системный аналитик48

Другие направления

  • Проджект-менеджер139
  • UI/UX дизайн71
  • Ручное тестирование14

По регионам

  • Вакансии в США24 791
  • Вакансии в Европе9 439
  • Работа в России2 924
  • Вакансии в Канаде2 178

По формату

  • Удалённые вакансии43 505
  • Релокация в США24 791
  • Гибридная работа3 370
  • Офисная работа2 525

По уровню

  • Senior вакансии20 898
  • Middle вакансии12 438
  • Junior вакансии3 864

Сейчас нанимают

Все компании
  • Wise191 вакансия
  • Rakuten188 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Celonis48 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме PydanticВсе вопросы
PydanticJuniorТеория

В чём разница между BaseModel и dataclasses в Pydantic?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

BaseModel — основной класс Pydantic с полной валидацией, сериализацией и schema-генерацией. pydantic.dataclasses — декоратор, добавляющий валидацию к стандартным датаклассам Python, сохраняя совместимость с typing.dataclass-интерфейсом.

BaseModel

BaseModel — родной инструмент Pydantic. Класс получает полный набор методов: model_validate(), model_dump(), model_dump_json(), model_json_schema(), model_copy() и другие. Поля описываются аннотациями типов и необязательным Field().

from pydantic import BaseModel, Field, ValidationError

class User(BaseModel):
    id: int
    name: str = Field(min_length=1, max_length=100)
    email: str
    age: int = Field(ge=0, le=150)

# Успешная валидация с автоприведением типов
user = User(id="42", name="Alice", email="alice@example.com", age=30)
print(user.id)          # 42 (int, строка приведена)
print(user.model_dump()) # {'id': 42, 'name': 'Alice', 'email': 'alice@example.com', 'age': 30}
print(user.model_dump_json())  # JSON-строка

# Ошибка валидации
try:
    User(id=1, name="", email="bad", age=-1)
except ValidationError as e:
    print(e.error_count())  # 2
    print(e.errors())       # список ошибок с path и msg

BaseModel и dataclasses в Pydantic

Pydantic предоставляет два способа описать валидируемую структуру данных: унаследоваться от BaseModel или применить декоратор pydantic.dataclasses.dataclass к обычному классу. Оба подхода выполняют runtime-валидацию, но отличаются контрактом, возможностями и совместимостью.

pydantic.dataclasses.dataclass

Декоратор @dataclass из модуля pydantic.dataclasses оборачивает стандартный Python-датакласс и добавляет валидацию при инициализации. Класс при этом остаётся совместимым с dataclasses.fields(), dataclasses.asdict() и другими утилитами стандартной библиотеки.

from pydantic.dataclasses import dataclass
from pydantic import Field, ValidationError
import dataclasses

@dataclass
class Point:
    x: float
    y: float
    label: str = Field(default="point", min_length=1)

# Создание с валидацией
p = Point(x="1.5", y=2, label="A")
print(p.x)   # 1.5 (float)
print(dataclasses.asdict(p))  # {'x': 1.5, 'y': 2.0, 'label': 'A'}

# Ошибка валидации
try:
    Point(x="bad", y=0)
except ValidationError as e:
    print(e)

Ключевые различия

  • Сериализация: BaseModel имеет встроенные model_dump() и model_dump_json(). У pydantic-датакласса нет этих методов — для сериализации нужен dataclasses.asdict() или оборачивание в TypeAdapter.
  • JSON Schema: BaseModel.model_json_schema() доступен напрямую. Для датакласса используют TypeAdapter(Point).json_schema().
  • Мутабельность: BaseModel по умолчанию иммутабелен (атрибуты защищены), но можно включить model_config = ConfigDict(frozen=True) или наоборот разрешить присвоение. Датакласс мутабелен по умолчанию, frozen=True задаётся в декораторе.
  • Наследование: BaseModel поддерживает полноценное наследование с переопределением полей и валидаторов. Наследование pydantic-датаклассов работает, но с ограничениями стандартного датакласса (порядок полей с дефолтами).
  • Совместимость: Pydantic-датаклассы совместимы с библиотеками, ожидающими стандартные датаклассы (например, некоторые ORM-адаптеры, cattrs). BaseModel не является датаклассом.

Когда что выбирать

  • Используйте BaseModel для request/response схем FastAPI, конфигурационных объектов, DTO — везде, где нужна полная мощь Pydantic.
  • Используйте @dataclass из Pydantic, когда код должен оставаться совместимым со стандартными датаклассами, или вы постепенно добавляете валидацию в существующую кодовую базу.
from pydantic import BaseModel, TypeAdapter
from pydantic.dataclasses import dataclass as pydantic_dataclass
import dataclasses

# BaseModel — полный набор Pydantic
class Config(BaseModel):
    host: str = "localhost"
    port: int = 5432

cfg = Config(port="5432")
print(cfg.model_dump())        # {'host': 'localhost', 'port': 5432}
print(cfg.model_json_schema()) # JSON Schema dict

# pydantic dataclass — совместимость со стандартной библиотекой
@pydantic_dataclass
class Config2:
    host: str = "localhost"
    port: int = 5432

cfg2 = Config2(port="5432")
print(dataclasses.asdict(cfg2))  # {'host': 'localhost', 'port': 5432}

# JSON Schema через TypeAdapter
ta = TypeAdapter(Config2)
print(ta.json_schema())

Подводные камни

  • Отсутствие model_dump у датакласса: попытка вызвать .model_dump() на pydantic-датаклассе приведёт к AttributeError. Используйте dataclasses.asdict() или TypeAdapter.
  • Порядок полей при наследовании датакласса: стандартное ограничение Python — поле без дефолта не может следовать за полем с дефолтом. При наследовании это ограничение сохраняется, что может вызвать TypeError при объявлении класса.
  • Мутация после создания: BaseModel по умолчанию запрещает присвоение атрибутов (model_config = ConfigDict(frozen=False) нужно явно включить). Если вы ожидаете мутабельный объект, явно настройте конфиг.
  • Validators и dataclass: декораторы @field_validator и @model_validator работают в pydantic-датаклассах, но ошибки валидации возникают только при инициализации — прямое присвоение атрибута после создания валидацию не запускает.
  • FastAPI и датаклассы: FastAPI принимает pydantic-датаклассы как тип параметра, но генерация OpenAPI-схемы может вести себя иначе, чем с BaseModel. Для response_model лучше использовать BaseModel.
  • Смешивание стандартного и pydantic dataclass: если вы унаследуетесь от стандартного @dataclasses.dataclass и попытаетесь применить pydantic-декоратор, поведение будет непредсказуемым — всегда начинайте иерархию с одного типа.
  • model_rebuild(): при forward references или сложных generic-моделях BaseModel требует явного вызова model_rebuild(). Для pydantic-датаклассов эта же проблема решается через rebuild_dataclass().
  • Производительность: pydantic v2 (Rust-core) быстр в обоих случаях, но BaseModel имеет чуть меньше накладных расходов на сериализацию за счёт встроенных оптимизированных методов.

Типичные ошибки

  • Описывать basemodel vs dataclasses только как термин и не показывать механизм на минимальном примере.
  • Игнорировать ошибки, пустые данные, конкурентный доступ или границы транзакции.
  • Не связывать поведение с официальным контрактом Pydantic и реальной эксплуатацией.

Что проверяет интервьюер

  • Объясняет basemodel vs dataclasses через последовательность действий, а не через набор ключевых слов.
  • Приводит короткий кодовый пример или production-сценарий с ожидаемым поведением.
  • Называет хотя бы один риск: производительность, безопасность, транзакции, память или сопровождение.

Как вы знаете этот вопрос?

Проверить себя по теме Pydantic →

Источники

  • https://docs.pydantic.dev/latest/concepts/dataclasses/
←Предыдущий вопросКак определить модель с разрешёнными или запрещёнными дополнительными полями (`extra='allow'` vs `extra='forbid'`)?Следующий вопрос→Расскажите о случае, когда вы осознанно выбрали или отвергли Pydantic для проекта.

Связанные темы

Pydanticpydantictechnical-reasoning

Частые вопросы на собеседовании

  • В чём разница между Pydantic v1 и Pydantic v2 — каковы основные breaking changes?
  • Что такое Pydantic и какую проблему он решает в Python-приложениях?
  • Как Pydantic использует аннотации типов Python для валидации данных?
  • Как Pydantic обрабатывает приведение типов (type coercion) — в чём разница между strict mode и lax mode?