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

Как прописать аннотацию возвращаемого типа?

1.3 Junior🔥 241 комментариев
#Python Core

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

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

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

Аннотация возвращаемого типа в Python

Аннотация возвращаемого типа (return type annotation) — это синтаксис, который позволяет указать, какой тип данных возвращает функция. Это улучшает читаемость кода, помогает IDE и инструментам статического анализа найти ошибки.

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

def function_name(param1: type1, param2: type2) -> return_type:
    """Описание функции"""
    return value

Стрелка -> указывает на тип возвращаемого значения.

Простые примеры

# Функция возвращает строку
def greet(name: str) -> str:
    return f"Hello, {name}!"

# Функция возвращает число
def add(a: int, b: int) -> int:
    return a + b

# Функция возвращает булево значение
def is_even(num: int) -> bool:
    return num % 2 == 0

# Функция ничего не возвращает
def print_message(message: str) -> None:
    print(message)

# Функция возвращает float
def calculate_average(numbers: list) -> float:
    return sum(numbers) / len(numbers)

Аннотация для коллекций

from typing import List, Dict, Tuple, Set

# Возвращает список целых чисел
def get_numbers() -> List[int]:
    return [1, 2, 3, 4, 5]

# Возвращает словарь
def get_user_data() -> Dict[str, str]:
    return {"name": "John", "email": "john@example.com"}

# Возвращает кортеж
def get_coordinates() -> Tuple[float, float]:
    return (10.5, 20.3)

# Возвращает множество
def get_unique_ids() -> Set[int]:
    return {1, 2, 3, 4, 5}

Объединение типов (Union)

from typing import Union, Optional

# Функция может вернуть int или str
def process_data(data: str) -> Union[int, str]:
    try:
        return int(data)
    except ValueError:
        return data

# Функция может вернуть значение или None
def find_user(user_id: int) -> Optional[Dict[str, str]]:
    users = {1: {"name": "John"}, 2: {"name": "Jane"}}
    return users.get(user_id)  # Возвращает dict или None

# С Python 3.10+ можно использовать | (pipe)
def get_value(key: str) -> int | str | None:
    return None

Аннотация для классов

# Функция возвращает объект класса
class User:
    def __init__(self, name: str):
        self.name = name

def create_user(name: str) -> User:
    return User(name)

# Самовозвращаемый тип (для методов)
class Calculator:
    def add(self, x: int) -> "Calculator":
        print(f"Добавление {x}")
        return self  # Возвращает себя для chain методов

# Использование
calc = Calculator().add(5).add(10)

Сложные типы

from typing import Callable, Iterator, Generator

# Функция возвращает другую функцию
def make_multiplier(n: int) -> Callable[[int], int]:
    def multiplier(x: int) -> int:
        return x * n
    return multiplier

multiply_by_3 = make_multiplier(3)
print(multiply_by_3(5))  # 15

# Функция возвращает генератор
def count_up_to(n: int) -> Generator[int, None, None]:
    i = 0
    while i < n:
        yield i
        i += 1

# Функция возвращает итератор
def iterate_data(data: list) -> Iterator[int]:
    for item in data:
        yield item

Списки с типами элементов

from typing import List, Dict, List

# Список с элементами определённого типа
def get_user_names() -> List[str]:
    return ["Alice", "Bob", "Charlie"]

# Список словарей
def get_users() -> List[Dict[str, str]]:
    return [
        {"id": "1", "name": "Alice"},
        {"id": "2", "name": "Bob"}
    ]

# Вложенные списки
def get_matrix() -> List[List[int]]:
    return [
        [1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]
    ]

Практический пример: API функции

from typing import List, Optional, Dict
from dataclasses import dataclass

@dataclass
class UserResponse:
    id: int
    name: str
    email: str

class UserService:
    def get_users(self, page: int = 1) -> List[UserResponse]:
        """Получить список пользователей"""
        return [
            UserResponse(1, "John", "john@example.com"),
            UserResponse(2, "Jane", "jane@example.com")
        ]
    
    def get_user(self, user_id: int) -> Optional[UserResponse]:
        """Получить пользователя или None"""
        if user_id == 1:
            return UserResponse(1, "John", "john@example.com")
        return None
    
    def update_user(self, user_id: int, data: Dict[str, str]) -> UserResponse:
        """Обновить пользователя"""
        return UserResponse(user_id, data["name"], data["email"])
    
    def delete_user(self, user_id: int) -> None:
        """Удалить пользователя"""
        print(f"Пользователь {user_id} удалён")

Аннотация с несколькими возвращаемыми значениями

from typing import Tuple

# Функция возвращает кортеж
def split_name(full_name: str) -> Tuple[str, str]:
    first, last = full_name.split()
    return first, last

# Использование
first, last = split_name("John Doe")

# Кортеж с именованными элементами (Python 3.6+)
from typing import NamedTuple

class Point(NamedTuple):
    x: float
    y: float

def get_location() -> Point:
    return Point(10.5, 20.3)

point = get_location()
print(point.x, point.y)

Использование аннотаций с mypy

# Статическая проверка типов
def add(a: int, b: int) -> int:
    return a + b

# Это вызовет ошибку при проверке mypy
result: str = add(5, 10)  # Error: Incompatible types

# Правильное использование
result: int = add(5, 10)  # OK

IDE помощь благодаря аннотациям

from typing import List

def get_user_ids() -> List[int]:
    return [1, 2, 3, 4, 5]

# IDE автоматически подскажет методы список
ids = get_user_ids()
ids.append(6)  # IDE поймёт, что это список и подскажет методы
ids.sort()      # IDE покажет методы списка

# Без аннотации IDE не сможет помочь
def get_data():
    return [1, 2, 3]  # IDE не знает, что это список

Проверка аннотаций в runtime

from typing import get_type_hints

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

# Получить аннотации функции
hints = get_type_hints(greet)
print(hints)  # {'name': <class 'str'>, 'return': <class 'str'>}

# Проверить тип возврата
if hints.get('return') == str:
    print("Функция возвращает строку")

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

# ✓ ХОРОШО - явно указаны все типы
def calculate(data: List[int]) -> float:
    return sum(data) / len(data)

# ✗ ПЛОХО - использование Any (избегать)
from typing import Any
def process(data: Any) -> Any:
    return data

# ✓ ХОРОШО - используй Optional вместо None
def find_item(items: List[str], target: str) -> Optional[str]:
    return target if target in items else None

# ✓ ХОРОШО - документируй сложные типы
def transform_users(users: List[Dict[str, str]]) -> Dict[int, str]:
    """Преобразовать список пользователей в словарь ID->имя"""
    return {i: user["name"] for i, user in enumerate(users)}

Вывод

Аннотация возвращаемого типа — это лучшая практика в Python, которая:

  • Улучшает читаемость кода
  • Помогает IDE подсказывать правильные методы
  • Позволяет инструментам (mypy) находить ошибки типов
  • Упрощает поддержку и рефакторинг кода
  • Документирует ожидаемое поведение функции

Использование аннотаций типов — это стандарт в современной Python разработке.