← Назад к вопросам

Как указать какой тип данных ожидает функция?

1.0 Junior🔥 211 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Type hints (аннотации типов)

В Python 3.5+ можно указывать ожидаемые типы данных функции через аннотации. Это помогает документировать код и находить ошибки с помощью статических анализаторов.

Базовый синтаксис

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

def add(a: int, b: int) -> int:
    return a + b

def process(data: list) -> dict:
    return {"count": len(data)}

Аннотация идёт после имени параметра, а -> указывает на тип возвращаемого значения.

Сложные типы

Для работы с параметризованными типами импортируй typing (Python 3.8) или collections.abc (Python 3.9+):

from typing import List, Dict, Optional, Union, Tuple

def process_items(items: List[str]) -> Dict[str, int]:
    return {item: len(item) for item in items}

def find_user(user_id: int) -> Optional[Dict]:
    # Optional[Dict] = Union[Dict, None]
    return {"id": user_id} if user_id > 0 else None

def convert(value: Union[int, float]) -> str:
    return str(value)

Современный подход (Python 3.9+)

От 3.9 можно использовать встроенные типы напрямую:

def process_items(items: list[str]) -> dict[str, int]:
    return {item: len(item) for item in items}

def find_user(user_id: int) -> dict | None:
    return {"id": user_id} if user_id > 0 else None

Callable и функции как параметры

from typing import Callable

def apply_func(func: Callable[[int, int], int], a: int, b: int) -> int:
    return func(a, b)

def process_data(processor: Callable[[list], dict]) -> dict:
    data = [1, 2, 3]
    return processor(data)

Проверка типов

Type hints не обеспечивают проверку в runtime. Для этого используют:

  • mypy — статический анализатор
  • pydantic — валидация с Pydantic моделями
  • runtime-checkable Protocols — проверка интерфейсов
import mypy
# mypy ищет ошибки типов перед запуском

from pydantic import BaseModel
class User(BaseModel):
    name: str
    age: int

# Pydantic автоматически валидирует при создании
user = User(name="John", age=30)  # OK
user = User(name="John", age="invalid")  # ValidationError

Лучшие практики

Всегда указывай типы для:

  • Публичных функций и методов
  • Параметров, особенно в больших проектах
  • Возвращаемых значений для ясности

Избегай:

  • Any без необходимости
  • Полагаться на type hints как на валидацию
  • Избыточной сложности в аннотациях

Type hints улучшают читаемость, помогают IDE автодополнению и ловят ошибки на ранних стадиях разработки.

Как указать какой тип данных ожидает функция? | PrepBro