Анотації типів у 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.pymypy --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, Лінтери, форматувальники та перевірники типів