Что такое generics в Python
Что проверяют
Переносите ли вы понимание параметрического полиморфизма на чужой язык. Для разработчика под iOS дженерики привычны по Swift, а на скриптах сборки, автотестах и утилитах вокруг мобильного проекта регулярно оказывается Python. Интервьюер смотрит, назовёте ли вы главное отличие: в Python это подсказки для статического анализатора, а не гарантия компилятора.
Как отвечать
Дженерики в Python это параметризация типом, которая связывает типы аргументов и результата. Классический способ объявить переменную типа даёт модуль typing, в современных версиях появился и компактный синтаксис с квадратными скобками прямо в объявлении функции или класса.
class Stack[T]:
def __init__(self) -> None:
self._items: list[T] = []
def push(self, item: T) -> None:
self._items.append(item)
def pop(self) -> T:
return self._items.pop()Дальше стоит проговорить ограничения: переменной типа можно задать верхнюю границу или перечислить допустимые типы, а вместо наследования интерфейса чаще используют Protocol, то есть структурную типизацию по набору методов.
И главное для сравнения со Swift: интерпретатор аннотации не проверяет и по ним ничего не специализирует. Никакого выигрыша по скорости, никаких таблиц свидетелей, ошибку ловит только статический анализатор в редакторе или в CI. Без анализатора в конвейере дженерики в Python остаются документацией.
Где спотыкаются
Ждут проверки во время выполнения, как в Swift. Параметризованный контейнер спокойно примет объект чужого типа, и код доживёт до продакшена. Проверка типов это отдельный шаг сборки, и если он не настроен, аннотации не значат ничего.
Ставят Any там, где нужна переменная типа. Any не значит «любой тип», он выключает проверку в этом месте, и связь между входом и выходом теряется: анализатор перестаёт понимать, что из хранилища строк выйдет строка.
Объявляют переменную типа без границы и пытаются вызвать у значения метод. Пока граница не задана, анализатор не знает про параметр ничего, кроме имени. Сюда же относится одна переменная типа на два независимых параметра: это требование их совпадения, а не разрешение подставить разные типы.