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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python8 752
  • Облачные технологии6 631
  • QA вакансии2 183
  • Android1 322
  • Инженер данных860
  • Продакт-менеджер316

Разработка

  • iOS1 238
  • Backend вакансии1 196
  • AI вакансии549
  • Fullstack вакансии500
  • Frontend вакансии426
  • Mobile вакансии28

По стеку

  • Go5 209
  • Java3 131
  • Kotlin1 113
  • Node.js1 008
  • Rust833
  • .NET656
  • PHP322
  • C++270
  • C#207

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

  • Kubernetes3 882
  • Linux-инфраструктура2 817
  • DevOps вакансии2 655
  • Terraform / IaC2 191
  • Мониторинг и Observability1 071
  • CI/CD919
  • SRE308
  • Кибербезопасность38

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

  • Аналитик данных522
  • Data Scientist435
  • Бизнес-аналитик397
  • Системный аналитик67

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

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

По регионам

  • Вакансии в США22 951
  • Вакансии в Европе10 259
  • Работа в России2 963
  • Вакансии в Канаде2 034

По формату

  • Удалённые вакансии39 691
  • Релокация в США22 951
  • Гибридная работа3 633
  • Офисная работа2 761

По уровню

  • Senior вакансии19 599
  • Middle вакансии11 130
  • Junior вакансии3 562

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

Все компании
  • Wise192 вакансии
  • Rakuten189 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Celonis42 вакансии
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

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

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

Как валидировать generic-модели и сложные union-типы в Pydantic v2?

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

Generic-модели объявляются через Generic[T] + BaseModel, Union-типы обрабатываются с помощью Annotated и discriminator. Pydantic v2 поддерживает model_validate для всех этих конструкций.

Generic-модели в Pydantic v2

Для создания параметризованной модели нужно унаследоваться одновременно от BaseModel и Generic[T]. При инстанциировании Pydantic строит специализированный validator plan для конкретного типа параметра.

from pydantic import BaseModel
from typing import Generic, TypeVar, List, Optional

T = TypeVar("T")

class Page(BaseModel, Generic[T]):
    items: List[T]
    total: int
    page: int
    size: int

class UserDTO(BaseModel):
    id: int
    name: str

# Специализация: Page[UserDTO]
raw = {
    "items": [{"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"}],
    "total": 2,
    "page": 1,
    "size": 10,
}
page = Page[UserDTO].model_validate(raw)
print(page.items[0].name)  # Alice
print(type(page.items[0])) # <class 'UserDTO'>

# Множественные TypeVar
K = TypeVar("K")
V = TypeVar("V")

class KVStore(BaseModel, Generic[K, V]):
    key: K
    value: V
    metadata: Optional[dict] = None

store = KVStore[str, int].model_validate({"key": "count", "value": "42"})
print(store.value)  # 42 (int)

Вложенные Generic

from pydantic import BaseModel
from typing import Generic, TypeVar, Optional

T = TypeVar("T")

class ApiResponse(BaseModel, Generic[T]):
    data: Optional[T] = None
    error: Optional[str] = None
    status_code: int

class Product(BaseModel):
    sku: str
    price: float

response = ApiResponse[Product].model_validate({
    "data": {"sku": "ABC-001", "price": "9.99"},
    "status_code": 200,
})
print(response.data.price)  # 9.99 (float)

Union-типы: базовый подход

Pydantic v2 поддерживает Union[A, B] и A | B (Python 3.10+). По умолчанию используется left-to-right matching: первый подходящий тип побеждает.

from pydantic import BaseModel
from typing import Union

class Cat(BaseModel):
    type: str = "cat"
    meow_volume: int

class Dog(BaseModel):
    type: str = "dog"
    bark_pitch: str

# Без дискриминатора — медленно и нестабильно на похожих схемах
class PetContainer(BaseModel):
    pet: Union[Cat, Dog]

container = PetContainer.model_validate({"pet": {"type": "dog", "bark_pitch": "high"}})
# Может выбрать Cat, если поля совпадают — непредсказуемо!

Discriminated Union с Annotated

Для надёжной маршрутизации используйте Annotated + Field(discriminator=...). Pydantic смотрит на значение поля-дискриминатора и сразу выбирает нужный валидатор — без перебора.

from pydantic import BaseModel, Field
from typing import Union, Literal, Annotated

class Cat(BaseModel):
    type: Literal["cat"]
    meow_volume: int

class Dog(BaseModel):
    type: Literal["dog"]
    bark_pitch: str

class Parrot(BaseModel):
    type: Literal["parrot"]
    vocabulary_size: int

Animal = Annotated[
    Union[Cat, Dog, Parrot],
    Field(discriminator="type"),
]

class Zoo(BaseModel):
    animals: list[Animal]

zoo = Zoo.model_validate({
    "animals": [
        {"type": "cat", "meow_volume": 8},
        {"type": "dog", "bark_pitch": "low"},
        {"type": "parrot", "vocabulary_size": 200},
    ]
})
print(type(zoo.animals[0]))  # <class 'Cat'>
print(type(zoo.animals[1]))  # <class 'Dog'>

TypeAdapter для валидации вне модели

from pydantic import TypeAdapter
from typing import Union, Literal, Annotated
from pydantic import Field

class CircleShape(BaseModel):
    kind: Literal["circle"]
    radius: float

class RectShape(BaseModel):
    kind: Literal["rect"]
    width: float
    height: float

Shape = Annotated[Union[CircleShape, RectShape], Field(discriminator="kind")]
ta = TypeAdapter(Shape)

shape = ta.validate_python({"kind": "circle", "radius": "5.0"})
print(shape.radius)  # 5.0

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

  • Generic без специализации — Page.model_validate(raw) (без Page[UserDTO]) оставит поле items как list[Any]; специализируйте явно.
  • Порядок в Union без дискриминатора — Union[int, str] всегда выберет int для "42" через coercion; поменяйте порядок или используйте strict mode.
  • Literal с None — Union[Cat, None] лучше записывать как Optional[Cat]; смешивание стилей путает IDE и генераторы схем.
  • Дискриминатор должен быть Literal — поле-дискриминатор обязано иметь тип Literal["value"] в каждом варианте Union; если оно просто str, Pydantic выбросит PydanticUserError.
  • Рекурсивные Generic — модели, ссылающиеся на себя через Generic, требуют model_rebuild() после определения класса.
  • JSON Schema для Generic — Page[UserDTO].model_json_schema() корректно работает только на специализированном классе; неспециализированный вернёт T как {}.

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

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

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

  • Отвечать определением без production-сценария.
  • Не называть runtime boundary, security boundary или failure mode.
  • Игнорировать версию API, observability и тестовую проверку.

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

  • Объясняет механизм своими словами и без выдуманных API.
  • Называет реальные риски, диагностику и критерий корректности.
  • Связывает ответ с текущей документацией и миграционными ограничениями.

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

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

Источники

  • https://docs.pydantic.dev/latest/migration/
←Предыдущий вопросЧто такое `TypeAdapter` в Pydantic v2 и как он валидирует данные вне модели?Следующий вопрос→Как сериализовать Pydantic-модель в JSON и обратно (`model_dump()`, `model_json_schema()`)?

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

Pydanticpydanticpydantic-productionrisk-analysistechnical-depth