Параметризованный декоратор требует трёх уровней вложенных функций, каждый из которых служит определённой цели.
n)func)*args и **kwargsdef repeat(n):
def decorator(func):
def wrapper(*args, **kwargs):
for _ in range(n):
func(*args, **kwargs)
return wrapper
return decorator
@repeat(3)
def greet():
print("Hi!")
Когда ты пишешь @repeat(3), Python сначала вызывает repeat(3), которая должна вернуть обычный декоратор. Затем возвращённый декоратор принимает greet в качестве аргумента.
Это эквивалентно:
greet = repeat(3)(greet)
repeat(3) → возвращает decoratordecorator(greet) → возвращает wrapperwrapper заменяет исходную greetДополнительный уровень вложенности существует, потому что параметры декоратора должны быть вычислены до того, как сам декоратор будет применён. Внешняя функция захватывает эти параметры через замыкание, делая их доступными внутри wrapper во время вызова.
Параметризованный декоратор требует три уровня вложенных функций, потому что внешняя функция должна захватывать параметры декоратора через замыкание, делая их доступными для внутренней функции-обёртки во время вызова.
Новый — ещё не проверен сообществом
Вы