Вопрос проверяет понимание того, что декораторы — это обычные функции, которые принимают и возвращают функции.
Синтаксис @decorator — это лишь сокращённая форма записи. На самом деле декоратор вызывается вручную: func = decorator(func). Декоратор принимает функцию, создаёт обёртку и возвращает новую функцию. Поэтому можно применять декораторы без @, просто вызывая их как обычные функции.
Декоратор — это функция высшего порядка.
Определение: Декоратор — функция, которая принимает функцию и возвращает новую функцию, обычно расширяющую поведение исходной.
def my_decorator(func):
def wrapper(*args, **kwargs):
print("Перед вызовом")
result = func(*args, **kwargs)
print("После вызова")
return result
return wrapper
Вместо:
@my_decorator
def hello():
print("Hello")
Интерпретатор фактически делает:
def hello():
print("Hello")
hello = my_decorator(hello)
динамическое применение декораторов;
условное декорирование;
метапрограммирование.
Пример:
if debug:
func = my_decorator(func)
Синтаксис @decorator — это просто удобная форма записи. На уровне выполнения декоратор всегда работает как вызов функции, которая принимает и возвращает функцию.