То, что мы называем «декоратором», это просто функция более высокого порядка , а синтаксис @decorator
- не более чем синтаксический сахар, так что:
@decorate
def func():
pass
строго эквивалентно
def func():
pass
func = decorate(func)
Как упомянул Гийом Десландес, если этот код находится на верхнем уровне вашего модуля или скрипта, декоратор вызывается только тогда, когда модуль или скрипт впервые загружаются средой выполнения.
В вашем случае функция декоратора register
возвращает свой аргумент (функцию, к которой она применяется) без изменений, поэтому вызов «украшенной» функции будет работать точно , как если бы она никогда не выполняласьукрашенный.
Если вы хотите каким-либо образом изменить декорированную функцию (путем выполнения кода до и после исходной функции или чего-либо еще), вы должны вернуть новую функцию, которая «заменит»оригинал (но - обычно - с сохранением ссылки на исходную функцию, чтобы эта новая функция-обертка все еще могла вызывать оригинал), что обычно делается с использованием факта закрытия функций Python :
def decorate(fun):
def wrapper(*args, **kw):
res = fun(*args, **kw)
print("function {} called with *{}, *{} returned {}".format(fun, args, kw, res)
return res
return wrapper
@decorate
def fun(a):
return a * 2