Что такое декораторы в Python?

«Что такое декораторы в Python?» — вопрос из категории Python, который задают на 33% собеседований Data Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

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

import time
import functools

def log_execution_time(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__} выполнилась за {end_time - start_time:.4f} секунд")
        return result
    return wrapper

@log_execution_time
def calculate_factorial(n):
    if n <= 1:
        return 1
    return n * calculate_factorial(n-1)

print(calculate_factorial(5))
# Вывод:
# calculate_factorial выполнилась за ... секунд
# 120

Почему это важно:

  • Разделение ответственности: Позволяет вынести сквозную функциональность (логирование, кэширование, аутентификацию) из бизнес-логики.
  • Повторное использование: Один декоратор можно применить ко многим функциям.
  • Читаемость: Использование @decorator над функцией явно указывает на добавленное поведение.

Ключевые моменты:

  • Декораторы могут быть вложенными (@decorator1 @decorator2).
  • Декораторы с аргументами требуют дополнительного уровня вложенности функций.
  • functools.wraps используется для корректной работы интроспекции (например, help() и имя функции).