Использовали ли type checkers в Python
Что проверяют
Пишете ли вы типизированный Python осознанно и понимаете ли, что проверка типов происходит до запуска, а не во время выполнения. Следом спрашивают, как вы внедряли проверку в существующий проект без аннотаций и чем mypy отличается от pydantic.
Как отвечать
Если использовали, расскажите конкретно: какой инструмент, на каком проекте, в каком режиме и что он поймал. Опорные факты:
- инструменты:
mypyкак эталонная реализация,pyrightот Microsoft (на нём работает Pylance в VS Code), а также новые быстрые проверяльщики на Rust:tyот Astral иpyreflyот Meta; - постепенное внедрение: конфиг в
pyproject.tomlв секции[tool.mypy], сначала мягкий режим, затемdisallow_untyped_defsпо модулям через[[tool.mypy.overrides]], в конце--strict. Запуск в pre-commit и в CI, красная проверка блокирует слияние; - сторонние библиотеки: стабы вроде
types-requests, маркерpy.typedу пакетов, которые поставляют типы сами,django-stubsи плагин pydantic для mypy; - приёмы:
Protocolдля утиной типизации,TypedDictдля словарей из JSON,reveal_type()для отладки вывода типов,# type: ignore[код-ошибки]точечно и с кодом, а не на весь файл.
Хорошо показать разницу: аннотации по PEP 484 интерпретатор не проверяет, это делает только внешний инструмент. Данные во время выполнения проверяет pydantic, и в сервисе на FastAPI они работают вместе.
Если не использовали, скажите честно, покажите, что пишете аннотации и знаете синтаксис вроде list[int] и X | None, и опишите, с чего бы начали: mypy в CI на новый код, старые модули через overrides.
Где спотыкаются
Думают, что аннотации проверяются при запуске. Функция с x: int спокойно примет строку, а упадёт она позже или не упадёт вовсе.
Не знают, что mypy по умолчанию не проверяет тела функций без аннотаций. Кажется, что ошибок нет, а на деле половина кода не анализируется. Помогает опция check_untyped_defs.
Путают линтер с проверкой типов. ruff и flake8 ловят стиль и часть багов, но совместимость типов между функциями не проверяют.