Используется ли тайпинг в Python
Что проверяют
Используете ли вы аннотации в работе и понимаете ли, что интерпретатор их не проверяет. Следом спрашивают, какой статический анализатор стоит у вас в CI и где аннотации работают во время выполнения.
Как отвечать
Да, используется, и в современных проектах почти повсеместно. Python остаётся динамически типизированным: аннотации описывают намерения, а проверяет их внешний инструмент.
- синтаксис: аннотации функций с Python 3.5 (PEP 484), переменных с 3.6. Сейчас пишут
list[int]вместоtyping.List(с 3.9) иint | NoneвместоOptional[int](с 3.10). В 3.12 появились обобщения видаdef first[T](items: list[T]) -> Tи инструкцияtypeдля псевдонимов; - инструменты:
mypyилиpyrightв CI, для нового кода лучше в строгом режиме. Для библиотек без аннотаций ставят стабы, напримерtypes-requests; - выразительные типы:
Protocolдля структурной типизации,TypedDictдля словарей с известными ключами,Literal,Self,@override,TypeGuard; - рантайм: Pydantic и FastAPI строят по аннотациям валидацию и схему API,
dataclassesгенерируют конструктор, SQLAlchemy 2.0 описывает колонки черезMapped[int].
Стоит упомянуть и вычисление аннотаций. Долгое время их вычисляли при определении функции, отсюда from __future__ import annotations и строки вместо имён классов при циклических ссылках. В Python 3.14 аннотации вычисляются лениво (PEP 649), и часть этих обходных приёмов больше не нужна.
Тайпинг не бесплатен: это время на аннотации и настройку анализатора. На большой кодовой базе он окупается при рефакторинге, когда анализатор находит все места с изменённой сигнатурой.
Где спотыкаются
Думают, что def f(x: int) запретит передать строку. Интерпретатор выполнит вызов, ошибку покажет только анализатор, и то если он запущен.
Заливают код Any и # type: ignore. Формально проект типизирован, фактически анализатор ничего не проверяет. Вместо Any лучше object или Protocol.
Путают TYPE_CHECKING и обычный импорт. Импорт внутри if TYPE_CHECKING: в рантайме не выполняется, и Pydantic, которому тип нужен при запуске, падает с ошибкой о не до конца определённой модели.