Python装饰器在加载/导入时执行

时间:2015-09-04 12:59:54

标签: python python-decorators

我试图围绕python的装饰师。但有一点我不明白。这是我的代码,我的问题与func_decorate2(带参数的装饰器)有关。

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()

将输出:

underscore
call func1
wrapped
func1
call func2
func2

为什么我在此示例中首先underscore

由于

2 个答案:

答案 0 :(得分:3)

因为func_decorate2('p')立即执行并返回一个装饰器,当解释器使用装饰器来装饰myfunc2时,装饰器会自动执行。

要实现的诀窍是@之后的部分只是一个表达式。它不一定是一个函数本身 - 它只需要评估为一个,并且评估会立即在定义上发生。

答案 1 :(得分:0)

因为func_decorate2错了。如果要在装饰器中使用参数,则必须再添加一个def级别

def func_decorate2(tag_name):
  def _(f):
    def _fun():
        print('underscore')
        return f
    return _fun
  return _