Как относиться к отсутствию аннотаций возврата функций в Python
Что проверяют
Понимаете ли вы, что аннотации не влияют на выполнение, но меняют поведение инструментов, и есть ли у вас взвешенная позиция для командного кода. Следом обычно спрашивают, как ввести типизацию в большой проект, где аннотаций нет.
Как отвечать
Начните с того, что происходит без аннотации возврата:
- интерпретатор: ничего. Аннотации не проверяются при вызове, они лежат в
__annotations__и доступны черезtyping.get_type_hints(); - mypy: не выводит тип возврата из тела. У функции с аннотированными аргументами возврат становится
Any, и ошибка у вызывающего кода проходит молча. Функция совсем без аннотаций считается нетипизированной, её тело по умолчанию не проверяется, пока не включён--check-untyped-defs; - pyright: выводит тип возврата сам, поэтому подсказки в IDE есть, но это вывод из текущей реализации, а не контракт;
- библиотеки: FastAPI берёт аннотацию возврата эндпоинта как модель ответа и фильтрует по ней поля.
Зрелая позиция: публичные функции и API модуля аннотируются обязательно, включая -> None. Во внутренних коротких хелперах и тестах допустимо полагаться на вывод типов. Правило фиксируется в CI, а не устной договорённостью: disallow_untyped_defs или --strict в mypy, правила ANN в ruff, например ANN201 для публичных функций.
Для легаси строгий режим включают помодульно через [[tool.mypy.overrides]] в pyproject.toml, начиная с ядра, и не требуют переписать всё сразу.
Где спотыкаются
Утверждают, что аннотация защищает от неверного типа при выполнении. Проверку в рантайме дают pydantic или beartype, сам Python её не делает.
Ставят -> Any или Union из пяти типов, чтобы линтер замолчал. Такой возврат обычно говорит о функции, которая делает слишком много.
Не пишут -> None у функции без аргументов. Для mypy она нетипизирована, и ошибки в её теле он пропускает.