Получить доступ

Как в аннотациях Python описать обобщённые типы — TypeVar, Generic, Protocol?

MiddleОкружение и инструментыPython >=3.12
Ещё спрашивают так:
  • Что такое TypeVar?
  • Как mypy проверяет типы, если Python их игнорирует?
Коротко

TypeVar — параметр типа: функция first(xs: list[T]) -> T сохраняет связь «что пришло, то и вернулось». Generic — обобщённый класс. С Python 3.12 — новый синтаксис: def first[T](xs: list[T]) -> T и class Box[T]. Проверяют их mypy и pyright, интерпретатор аннотации не проверяет.

  • Ограничения: bound=Comparable или набор типов TypeVar("T", int, str)
  • Union через |, Optional[X] = X | None (3.10)
  • Pydantic и FastAPI читают аннотации во время выполнения — там они влияют на поведение

А ещё Any отключает проверку; object — безопасный «что угодно»

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Без TypeVar функция def first(xs: list) -> object теряет тип: first(["a"]).upper() — ошибка проверки. С параметром типа анализатор знает, что вернётся str.

Синтаксис по версиям: до 3.12 — T = TypeVar("T") и class Box(Generic[T]); с 3.12 — параметры в квадратных скобках прямо в объявлении (PEP 695), type Alias = ... для псевдонимов.

Вариантность: list[int] не подтип list[object] (инвариантен, потому что изменяем), а Sequence[int] — подтип Sequence[object] (ковариантен, только чтение). Это та же идея, что PECS в Java.

Практика: проверка в CI (mypy --strict или pyright) на новом коде, постепенное включение в старом; reveal_type() показывает выведенный тип.

Пример

from typing import Protocol

def first[T](items: list[T]) -> T:        # Python 3.12
    return items[0]

class SupportsLess(Protocol):
    def __lt__(self, other, /) -> bool: ...

def max_of[T: SupportsLess](a: T, b: T) -> T:
    return b if a < b else a

class Repo[T]:
    def get(self, id: int) -> T | None: ...

Что хотят услышать

  • Зачем TypeVar и Generic.
  • Новый синтаксис 3.12.
  • Кто проверяет аннотации.

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

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем