EMZETT.
Увійти

Анотації типів у Python: type hints і mypy

Коротко: Type hints описують, які типи функції очікують і повертають; Python сам їх не перевіряє, але редактори та інструменти на кшталт mypy знаходять помилки до запуску.

Докладніше: Python — динамічно типізована мова: типи визначаються під час виконання. Починаючи з Python 3.5 можна вказувати анотації типів. Вони — документація та допомога в перевірці, але не змінюють поведінку під час виконання.

Подробиці

Основи

def greet(name: str, count: int = 1) -> str:
    return ("Hello " + name + "! ") * count
prices: dict[str, float] = {"Game": 12.5}
names: list[str] = []
coordinate: tuple[int, int] = (3, 4)

Сучасний запис з 3.9/3.10: list[int], dict[str, int], int | None (замість Optional[int]), X | Y для об’єднань. Повернення None: -> None. Для функцій без повернення не використовуйте -> any.

Корисні типи

  • Optional[T] / T | None: значення або нічого.
  • Union, Literal["a", "b"], Any (вимикає перевірку).
  • Callable[[int], str] для функцій, Iterable, Sequence, Mapping.
  • TypedDict, NamedTuple, dataclass, Protocol (структурна типізація/«качина типізація» з перевіркою).
  • Generic/TypeVar для узагальнених функцій/класів: def first(xs: list[T]) -> T.
  • Final, ClassVar, Self, override.
  • Псевдоніми типів: Price = float, type Point = tuple[int, int] (3.12).

Перевірка через mypy/pyright

pip install mypy
mypy my_file.py

mypy --strict суворий; вводьте крок за кроком (поступова типізація). Редактори (VS Code з Pylance/pyright, PyCharm) показують помилки наживо. Приклад: greet(5) повідомляє «argument 1 has incompatible type int; expected str» до запуску програми. Запускайте в CI. Бібліотеки без типів: пакети types-… (заглушки). # type: ignore використовуйте ощадливо.

Користь і межі

  • Переваги: менше помилок (помилки None!), краще автодоповнення, читабельність, безпека рефакторингу; основа фреймворків на кшталт FastAPI/pydantic (типи використовуються під час виконання для валідації).
  • Межі: під час виконання нічого не перевіряється; хибна анотація бреше; дуже динамічний код важко типізувати.
  • Практика: анотуйте публічні функції та інтерфейси, невеликі внутрішні скрипти не обов’язково.
  • Порівняння: TypeScript (JS), Java/C# (статичні) – Python типізований необов’язково.
  • Іспит/навчання: знаходьте помилки типів до запуску; перевіряйте через reveal_type(x) у mypy.

Див. також: TypeScript, Лінтери, форматувальники та перевірники типів