Вопрос проверяет понимание декораторов в Python — механизма для модификации поведения функций или классов без изменения их исходного кода.
Декоратор в Python — это мощный инструмент метапрограммирования, который позволяет изменять или расширять поведение функций (или классов), оборачивая их в другую функцию. По сути, декоратор — это функция высшего порядка, принимающая целевую функцию в качестве аргумента и возвращающая новую функцию, обычно называемую обёрткой (wrapper). Эта обёртка выполняет дополнительный код до и/или после вызова исходной функции.
Синтаксически декоратор применяется с помощью символа @ перед его именем над определением функции. Это всего лишь синтаксический сахар для более простой записи. Например, запись @decorator над функцией func эквивалентна func = decorator(func).
Рассмотрим декоратор, который замеряет время выполнения функции:
import time
def timer_decorator(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs) # Вызов исходной функции
end_time = time.time()
print(f"Функция {func.__name__} выполнилась за {end_time - start_time:.4f} секунд")
return result
return wrapper
@timer_decorator
def calculate_sum(n):
return sum(range(n))
# При вызове calculate_sum(1000000) будет выведено время выполнения.
@functools.lru_cache).Иногда нужно передать параметры самому декоратору. В этом случае создаётся ещё один уровень вложенности — функция, возвращающая декоратор.
def repeat(times):
"""Декоратор, повторяющий вызов функции заданное количество раз."""
def decorator(func):
def wrapper(*args, **kwargs):
for _ in range(times):
result = func(*args, **kwargs)
return result # возвращаем результат последнего вызова
return wrapper
return decorator
@repeat(times=3)
def greet(name):
print(f"Привет, {name}!")
# Вызов greet("Анна") напечатает приветствие три раза.
Вывод: Декораторы стоит применять, когда необходимо добавить сквозную функциональность (cross-cutting concern) к нескольким функциям, избегая дублирования кода. Они делают код чище, модульнее и легче для поддержки, особенно в веб-фреймворках (например, Flask, Django) и библиотеках.