Для чего нужен декоратор в Python?

«Для чего нужен декоратор в Python?» — вопрос из категории Python, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Декоратор в Python — это функция, которая принимает другую функцию и расширяет или изменяет её поведение, не модифицируя исходный код оборачиваемой функции. Это мощный инструмент для реализации аспектно-ориентированного программирования.

Основные применения:

  • Логирование: автоматическое логирование вызовов функций и их аргументов.
  • Кеширование (мемоизация): сохранение результатов дорогостоящих вызовов.
  • Контроль доступа: проверка прав пользователя перед выполнением функции.
  • Валидация: проверка входных данных или выходных результатов.
  • Замер времени выполнения: профилирование кода.
  • Повторные попытки (retry): автоматический повтор вызова при сбоях.

Пример декоратора для замера времени:

import time
import functools

def timer(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        start_time = time.perf_counter()
        result = func(*args, **kwargs)
        end_time = time.perf_counter()
        print(f"Функция {func.__name__!r} выполнилась за {end_time - start_time:.4f} сек")
        return result
    return wrapper

@timer
def calculate_sum(n):
    return sum(range(n))

# При вызове будет выведено время выполнения
result = calculate_sum(1_000_000)

Декораторы помогают соблюдать принцип единственной ответственности (Single Responsibility Principle) и избегать дублирования кода.