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

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

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

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

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

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

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

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

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

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

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

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

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

Разработка

  • iOS1 240
  • Backend вакансии1 212
  • AI вакансии553
  • Fullstack вакансии503
  • Frontend вакансии428
  • Mobile вакансии28

По стеку

  • Go5 300
  • Java3 171
  • Kotlin1 128
  • Node.js1 016
  • Rust862
  • .NET676
  • PHP321
  • C++273
  • C#208

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

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

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

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

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

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

По регионам

  • Вакансии в США25 642
  • Вакансии в Европе10 259
  • Работа в России3 639
  • Вакансии в Канаде2 255

По формату

  • Удалённые вакансии42 339
  • Релокация в США25 642
  • Гибридная работа5 706
  • Офисная работа4 402

По уровню

  • Senior вакансии22 510
  • Middle вакансии11 429
  • Junior вакансии3 877

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

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

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

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

Что такое TypeAdapter в Pydantic v2 и как он валидирует данные вне модели?

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

TypeAdapter позволяет использовать всю мощь валидации Pydantic для произвольных Python-типов (list, dict, Union, примитивы) без создания класса BaseModel.

Базовый синтаксис

from pydantic import TypeAdapter, ValidationError
from typing import List, Dict, Optional
from datetime import datetime

# TypeAdapter для списка целых чисел
ta_int_list = TypeAdapter(List[int])
result = ta_int_list.validate_python(["1", "2", "3"])  # coercion
print(result)  # [1, 2, 3]

# TypeAdapter для datetime
ta_dt = TypeAdapter(datetime)
dt = ta_dt.validate_python("2024-01-15T12:00:00")
print(dt)  # 2024-01-15 12:00:00
print(type(dt))  # <class 'datetime.datetime'>

# Валидация из JSON
ta_dict = TypeAdapter(Dict[str, int])
d = ta_dict.validate_json('{"a": 1, "b": 2}')
print(d)  # {'a': 1, 'b': 2}

# Ошибка валидации
try:
    ta_int_list.validate_python(["not", "numbers"])
except ValidationError as e:
    print(e)

Зачем нужен TypeAdapter

Методы model_validate() и model_validate_json() доступны только для подклассов BaseModel. Но иногда нужно провалидировать встроенный тип, List[SomeModel], Union, или аннотированный тип без создания обёртки. TypeAdapter решает эту задачу.

Валидация списков Pydantic-моделей

from pydantic import BaseModel, TypeAdapter
from typing import List
import json

class UserDTO(BaseModel):
    id: int
    name: str
    active: bool = True

# Один раз создаём адаптер — он кеширует validator plan
UserListAdapter = TypeAdapter(List[UserDTO])

raw_json = b'[{"id": "1", "name": "Alice"}, {"id": "2", "name": "Bob", "active": false}]'
users = UserListAdapter.validate_json(raw_json)
print(users[0].name)    # Alice
print(users[1].active)  # False

# Сериализация списка обратно в JSON
json_out = UserListAdapter.dump_json(users)
print(json_out)  # b'[{"id":1,"name":"Alice","active":true},...]'

# Генерация JSON Schema для списка
schema = UserListAdapter.json_schema()
print(schema["type"])  # array

TypeAdapter с Annotated-типами

from pydantic import TypeAdapter
from typing import Annotated
from pydantic import Field

# Валидация примитива с ограничениями без создания модели
PositiveInt = Annotated[int, Field(gt=0, le=1_000_000)]
ta = TypeAdapter(PositiveInt)

print(ta.validate_python(42))     # 42
print(ta.validate_python("100"))  # 100 (coercion)

try:
    ta.validate_python(-1)
except Exception as e:
    print(e)  # Input should be greater than 0

# Переиспользуемый тип для email
from pydantic import EmailStr
EmailAdapter = TypeAdapter(EmailStr)
email = EmailAdapter.validate_python("user@example.com")

Сравнение с RootModel и BaseModel

from pydantic import BaseModel, RootModel, TypeAdapter
from typing import List

# Вариант 1: BaseModel (нужна обёртка с полем)
class UserListModel(BaseModel):
    items: List[dict]

# Вариант 2: RootModel (корневое значение, переиспользуемый класс)
class UserList(RootModel[List[dict]]):
    pass

# Вариант 3: TypeAdapter (без класса, одноразово или через переменную)
ta = TypeAdapter(List[dict])
result = ta.validate_python([{"id": 1}])

# TypeAdapter предпочтителен когда:
# - тип встроенный (list, dict, int)
# - нужна одноразовая валидация в функции
# - не нужен именованный класс с методами

TypeAdapter в FastAPI для нестандартных ответов

from fastapi import FastAPI
from pydantic import TypeAdapter, BaseModel
from typing import List

app = FastAPI()

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

ItemListAdapter = TypeAdapter(List[Item])

@app.get("/items")
def get_items() -> List[Item]:
    raw = [{"id": "1", "name": "Laptop"}, {"id": "2", "name": "Phone"}]
    return ItemListAdapter.validate_python(raw)

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

  • Создавайте TypeAdapter один раз — инициализация компилирует validator plan в Rust; создание TypeAdapter(List[UserDTO]) внутри цикла или функции на каждый вызов — дорогостоящая операция. Выносите в модульный уровень или атрибут класса.
  • TypeAdapter не поддерживает model_config — настройки типа populate_by_name или strict нельзя передать через TypeAdapter; для тонкой настройки создавайте BaseModel.
  • dump_json() возвращает bytes — в отличие от BaseModel.model_dump_json(), который возвращает str, метод TypeAdapter.dump_json() возвращает bytes.
  • validate_python vs validate_json — validate_python принимает Python-объекты (может выполнять coercion), validate_json принимает JSON-строку или байты и работает быстрее за счёт Rust-парсера.
  • TypeAdapter(Optional[X]) и None — TypeAdapter(Optional[int]).validate_python(None) корректно возвращает None, но validate_json("null") тоже нужно проверять отдельно.

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

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

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

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

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

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

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

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

Источники

  • https://docs.pydantic.dev/latest/concepts/type_adapter/
←Предыдущий вопросКаковы улучшения производительности в Pydantic v2 (ядро на Rust) по сравнению с v1?Следующий вопрос→Как валидировать generic-модели и сложные union-типы в Pydantic v2?

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

Pydanticimplementationpydantictechnical-reasoning