I am trying to wrap my head around python's decorator. But there is something I don't understand. This is my code, my question is related to func_decorate2
(decorator with parameter).
def func_decorate(f):
def wrapper():
print('wrapped');
f()
return wrapper
@func_decorate
def myfunc1():
print('func1')
def func_decorate2(tag_name):
def _(f):
print('underscore')
return f
return _
@func_decorate2('p')
def myfunc2():
print('func2')
print('call func1')
myfunc1()
print('call func2')
myfunc2()
Will output :
underscore
call func1
wrapped
func1
call func2
func2
Why do I have underscore
first in this example ?
Thanks
Because func_decorate2('p')
executes immediately and returns a decorator that is then itself immediately executed when the interpreter uses it to decorate myfunc2
.
The trick to realize is the part following the @
is just an expression. It doesn't have to be a function itself – it just needs to evaluate to one and the evaluation happens immediately on definition.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With