Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python Decorator executed on load/import [duplicate]

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

like image 566
jobou Avatar asked Sep 26 '22 20:09

jobou


1 Answers

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.

like image 178
David K. Hess Avatar answered Sep 30 '22 07:09

David K. Hess