История вопроса: Type hints появились в Python 3.5 (PEP 484) для поддержки статического анализа кода, автодополнения, рефакторинга и авто-документации. Ранее Python успешно обходился без жёсткой типизации, но с ростом проектов и команд они стали необходимы для повышения качества кода.
Проблема: Аннотации типов — всего лишь подсказки для разработчиков и внешних инструментов (mypy, Pyright и др.), сам интерпретатор их игнорирует во время выполнения. Ошибки часто возникают, если:
Решение: Используйте аннотации типов для функций и переменных для удобства читаемости, анализа кода линтерами и IDE. Не стоит полагаться исключительно на аннотации — нужен статический типовой чекер. Пример:
def greeting(name: str) -> str: return f"Hello, {name}" def sum_nums(nums: list[int]) -> int: return sum(nums)
Более сложные примеры используют typing-модуль:
from typing import List, Dict, Optional def process(data: List[Dict[str, Optional[int]]]) -> None: ...
Ключевые особенности:
Обрабатывает ли интерпретатор Python типы из аннотаций на этапе выполнения?
Нет. Аннотации доступные через __annotations__, но не контролируют поведение во время выполнения.
Можно ли использовать переменные без аннотаций в аннотированных функциях?
Да. Аннотации — не обязательны, но их отсутствие может запутать.
Можно ли переопределять тип переменной после аннотации?
Да, но это нарушает суть статического анализа и мешает линтерам. Лучше избегать такого:
x: int = 5 x = 'строка' # Линтер будет ругаться, но код выполнится.
Негативный кейс: Аннотируют функцию, но реально возвращается тип, отличный от того, что в аннотации, из-за изменения логики функции. Плюсы:
Положительный кейс: Все функции и данные аннотированы, проект проверяется mypy при CI/CD. Плюсы: