Аннотирование типов в Python

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

Аннотирование типов переменных

Вы можете указать тип данных переменной с помощью двоеточия :.

Пример:

age: int = 25
name: str = "Анна"
is_student: bool = True

В этом примере переменные age, name и is_student аннотированы как типы int, str и bool соответственно.

Аннотирование типов функций

Для аннотирования типов параметров функции и ее возвращаемого значения используется следующий синтаксис:

Синтаксис:

def function_name(param1: Type1, param2: Type2) -> ReturnType:
    ...

Пример:

def greet(name: str) -> str:
    return f"Привет, {name}!"

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

Здесь функция greet() принимает строку name и возвращает строку, а функция add() принимает два целых числа и возвращает целое число.

Аннотации для сложных типов

Python поддерживает аннотирование сложных типов, таких как списки, словари, кортежи и прочее. Для этого используется модуль typing, который предоставляет различные специальные типы.

Пример:

from typing import List, Dict, Tuple

def process_numbers(numbers: List[int]) -> List[int]:
    return [n * 2 for n in numbers]

def get_user_data() -> Dict[str, str]:
    return {"name": "Анна", "city": "Москва"}

def get_coordinates() -> Tuple[float, float]:
    return (55.7558, 37.6173)

Здесь:

  • List[int] обозначает список целых чисел.

  • Dict[str, str] обозначает словарь, где ключи и значения — строки.

  • Tuple[float, float] обозначает кортеж с двумя числами с плавающей точкой.

Аннотирование функций с переменным числом аргументов

Вы можете аннотировать функции с переменным числом аргументов, используя *args и **kwargs.

Пример:

from typing import Any

def mixed_function(*args: int, **kwargs: Any) -> None:
    print("Позиционные аргументы:", args)
    print("Именованные аргументы:", kwargs)

Здесь *args: int означает, что функция принимает произвольное количество целых чисел в качестве позиционных аргументов, а **kwargs: Any — произвольное количество именованных аргументов любого типа.

Аннотирование типов для функций, возвращающих None

Если функция ничего не возвращает (например, просто печатает что-то), это можно указать с помощью None.

Пример:

def print_message(message: str) -> None:
    print(message)

Опциональные типы

Если параметр функции может принимать значение None, это можно указать с помощью Optional из модуля typing.

Пример:

from typing import Optional

def greet(name: Optional[str] = None) -> str:
    if name:
        return f"Привет, {name}!"
    else:
        return "Привет, гость!"

Здесь Optional[str] означает, что name может быть строкой или None.

Аннотации для функций высшего порядка

Если функция принимает другую функцию в качестве аргумента или возвращает её, можно использовать Callable.

Пример:

from typing import Callable

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

def add(x: int, y: int) -> int:
    return x + y

result = execute_function(add, 5, 3)

Здесь Callable[[int, int], int] означает, что func — это функция, принимающая два целых числа и возвращающая целое число.

Объявление собственных типов

Вы можете создавать именованные типы с помощью TypeAlias (начиная с Python 3.10) или просто присваивая тип переменной.

Пример:

from typing import List, TypeAlias

# Вариант 1: TypeAlias (Python 3.10+)
Vector: TypeAlias = List[float]

# Вариант 2: Простое присваивание
Vector = List[float]

def add_vectors(v1: Vector, v2: Vector) -> Vector:
    return [x + y for x, y in zip(v1, v2)]

Заключение

Аннотирование типов в Python помогает повысить читаемость кода, облегчает его поддержку и позволяет использовать инструменты для статической проверки типов. Несмотря на то, что аннотации типов не обязательны и не выполняются во время выполнения программы, они служат важной частью современного Python-кода.

Last updated