Python函数装饰器拼图

时间:2016-07-03 15:12:03

标签: python decorator

我最近租用了python装饰器的主题,发现以下两个不同的程序有些奇怪:

例1:

def deco(func):
    def inner():
        print("Running inner")
    return func

@deco
def target():
    print("Running target")

def main():
    print("Running main()")
    target()

if __name__ == "__main__":
    main()

例2:

def deco(func):
    print("Running inner")
    return func

@deco
def target():
    print("Running target")

def main():
    print("Running main()")
    target()

if __name__ == "__main__":
    main()

运行Example1和Example2时,会得到2个不同的结果:

Running main()
Running target
例1中的

Running inner
Running main()
Running target
例2中的

似乎"跑步内心"在Example1中丢失了。为什么呢?

1 个答案:

答案 0 :(得分:4)

运行示例2将给出该结果,因为deco在定义时执行,并且在该示例中它立即打印inner

示例1不会打印内部因为您从未对inner func执行任何操作。你的装饰者应该返回inner,而不是func;和inner本身应该调用func:

def deco(func):
    def inner():
        print("Running inner")
        func()
    return inner   # note change here

执行此操作时,您将获得以下结果:

Running main()
Running inner
Running target

这是你对装饰者的期望。