Что такое аннотации типов (type hints)?python-32

Аннотации типов (подсказки типов) — это механизм в Python, позволяющий явно указывать ожидаемые типы данных для переменных, параметров функций и возвращаемых значений. Они были введены в PEP 484 и помогают улучшить читаемость кода, упростить его поддержку и интегрироваться со средствами статической проверки типов (например, mypy).

Основные концепции

1. Синтаксис аннотаций

Аннотации добавляются через двоеточие (:) для переменных и стрелку (->) для возвращаемого значения функции.

def greet(name: str) -> str:
    return f"Hello, {name}"

age: int = 25

2. Зачем нужны аннотации?

  • Документирование кода: делают ожидаемые типы явными.
  • Статический анализ: инструменты вроде mypy или pyright могут находить ошибки до запуска кода.
  • Поддержка в IDE: автодополнение и подсказки становятся точнее (например, в VSCode или PyCharm).

3. Стандартные типы

Используются встроенные типы (str, int, list и т.д.) и специальные конструкции из модуля typing:

from typing import List, Dict, Optional

def process_data(data: List[int]) -> Dict[str, Optional[int]]:
    return {"result": data[0] if data else None}

4. Сложные аннотации

  • Union: значение может быть одного из нескольких типов.
  • Optional: краткая запись для Union[T, None].
  • Generic (Дженерики): обобщенные типы для контейнеров.
from typing import Union, Optional, Generic, TypeVar

T = TypeVar('T')

class Box(Generic[T]):
    def __init__(self, item: T):
        self.item = item

def parse_input(value: Union[str, int]) -> Optional[bool]:
    if isinstance(value, str):
        return value.lower() == "true"
    return None

5. Аннотации в классах

Можно аннотировать атрибуты класса и методы:

class User:
    def __init__(self, name: str, age: int):
        self.name = name
        self.age = age

    def get_info(self) -> str:
        return f"{self.name} ({self.age})"

Ограничения

  • Динамическая типизация: Python не проверяет типы во время выполнения (только при статическом анализе).
  • Опциональность: аннотации не обязательны и не влияют на выполнение кода.

Резюмируем

Аннотации типов — это мощный инструмент для:

  • Улучшения читаемости и документирования кода.
  • Раннего обнаружения ошибок через статический анализ.
  • Улучшения работы инструментов разработки (IDE, линтеры).

Пример с подсветкой (как в VSCode):

from typing import Iterable

def calculate_average(numbers: Iterable[float]) -> float:
    return sum(numbers) / len(numbers) if numbers else 0.0