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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python7 042
  • Облачные технологии5 085
  • QA вакансии1 814
  • Android1 199
  • Инженер данных831
  • Продакт-менеджер339

Разработка

  • iOS1 135
  • Backend вакансии1 131
  • Fullstack вакансии475
  • AI вакансии458
  • Frontend вакансии404
  • Mobile вакансии27

По стеку

  • Go4 093
  • Java2 435
  • Kotlin990
  • Node.js827
  • Rust665
  • .NET525
  • PHP282
  • C++223
  • C#199

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

  • Kubernetes2 931
  • Linux-инфраструктура2 312
  • DevOps вакансии2 110
  • Terraform / IaC1 714
  • CI/CD872
  • Мониторинг и Observability825
  • SRE253
  • Кибербезопасность50

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

  • Аналитик данных497
  • Data Scientist463
  • Бизнес-аналитик374
  • Системный аналитик54

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

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

По регионам

  • Вакансии в США25 531
  • Вакансии в Европе9 792
  • Работа в России3 193
  • Вакансии в Канаде2 236

По формату

  • Удалённые вакансии43 578
  • Релокация в США25 531
  • Гибридная работа4 289
  • Офисная работа3 340

По уровню

  • Senior вакансии21 650
  • Middle вакансии12 211
  • Junior вакансии3 886

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

Все компании
  • Rakuten188 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Wise125 вакансий
  • Celonis28 вакансий
  • Infobip28 вакансий
  • Spotify24 вакансии
  • Adyen17 вакансий
  • Darktrace17 вакансий
  • Monzo13 вакансий

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

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

Как обрабатывать forward references и циклические зависимости моделей в Pydantic?

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

Forward references решаются через строковые аннотации ("ClassName") или from __future__ import annotations, после чего вызывается model_rebuild(). Для циклических зависимостей между модулями используют TYPE_CHECKING + model_rebuild() после импорта всех классов.

Базовый случай: ссылка на класс, определённый ниже

from __future__ import annotations
from pydantic import BaseModel

class Department(BaseModel):
    name: str
    manager: Employee | None = None  # Employee ещё не определён

class Employee(BaseModel):
    name: str
    department: Department

# После определения обоих классов — обновляем схемы
Department.model_rebuild()
Employee.model_rebuild()

Forward references и циклические зависимости в Pydantic

Forward reference — это строковая аннотация типа, ссылающаяся на класс, который ещё не определён в момент объявления модели. В Python это делается через строку "ClassName" или через from __future__ import annotations. Циклические зависимости возникают когда модель A ссылается на модель B, а B — на A.

Явные строковые аннотации без from __future__

from pydantic import BaseModel
from typing import Optional

class TreeNode(BaseModel):
    value: int
    left: Optional["TreeNode"] = None   # строковая форма
    right: Optional["TreeNode"] = None

TreeNode.model_rebuild()  # разрешить self-reference

root = TreeNode(value=1, left=TreeNode(value=2), right=TreeNode(value=3))
print(root.model_dump())
# {'value': 1, 'left': {'value': 2, 'left': None, 'right': None}, ...}

Настоящие циклические зависимости между двумя модулями

Когда модели в разных файлах ссылаются друг на друга, используйте TYPE_CHECKING:

# models/user.py
from __future__ import annotations
from typing import TYPE_CHECKING
from pydantic import BaseModel

if TYPE_CHECKING:
    from models.post import Post  # только для mypy/pyright, не выполняется в runtime

class User(BaseModel):
    id: int
    name: str
    posts: list[Post] = []  # строка из-за from __future__ import annotations

# models/post.py
from __future__ import annotations
from typing import TYPE_CHECKING
from pydantic import BaseModel

if TYPE_CHECKING:
    from models.user import User

class Post(BaseModel):
    id: int
    title: str
    author: User

# main.py — после импорта обоих модулей
from models.user import User
from models.post import Post

User.model_rebuild()
Post.model_rebuild()

model_rebuild() с явным пространством имён

Если автоматическое разрешение типов не работает, можно передать namespace явно:

from pydantic import BaseModel

class Node(BaseModel):
    value: str
    children: list["Node"] = []

# _types_namespace позволяет указать, где искать 'Node'
Node.model_rebuild(_types_namespace={"Node": Node})

# Проверка: schema должна корректно показывать рекурсию
import json
print(json.dumps(Node.model_json_schema(), indent=2))

Update_forward_refs в Pydantic v1 (legacy)

# Pydantic v1 API
from pydantic import BaseModel

class Category(BaseModel):
    name: str
    subcategories: list["Category"] = []

Category.update_forward_refs()  # v1 эквивалент model_rebuild()

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

  • Забыть вызвать model_rebuild() — Pydantic не выбросит ошибку при определении класса, но при первом создании экземпляра или при вызове model_json_schema() возникнет PydanticUserError: A non-annotated attribute was detected или NameError.
  • from __future__ import annotations меняет ВСЕ аннотации на строки — включая те, где это не нужно. Это влияет на get_type_hints() и может ломать другие инструменты интроспекции.
  • TYPE_CHECKING блок не выполняется в runtime — если случайно поместить туда не только импорт, но и логику, она будет недоступна.
  • model_rebuild() нужно вызывать после определения ВСЕХ задействованных классов — если вызвать слишком рано, часть форвард-референсов не разрешится.
  • Бесконечная рекурсия при сериализации — модели с двунаправленными ссылками (User → Post → User) могут уйти в бесконечный цикл при model_dump(). Используйте model_dump(exclude={"posts": {"__all__": {"author"}}}) или отдельные Response-схемы без обратных ссылок.
  • JSON Schema с циклами — Pydantic генерирует $defs для рекурсивных моделей, но некоторые OpenAPI-клиенты не поддерживают $ref на вложенные структуры корректно.
  • Миграция v1 → v2 — update_forward_refs() заменяется на model_rebuild(); параметры namespace передаются иначе.

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

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

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

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

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

  • Объясняет forward references через последовательность действий, а не через набор ключевых слов.
  • Приводит короткий кодовый пример или production-сценарий с ожидаемым поведением.
  • Называет хотя бы один риск: производительность, безопасность, транзакции, память или сопровождение.
  • Умеет обсудить отказ, наблюдаемость и rollback без изменения публичного контракта.

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

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

Источники

  • https://docs.pydantic.dev/latest/concepts/models/
  • https://docs.pydantic.dev/latest/concepts/validation_decorator/

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

Pydanticpydantictechnical-reasoning