Python 函数装饰器谜题

Python Function Decorator Puzzle

我最近学习了 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 中。

似乎 "Running inner" 在示例 1 中丢失了。为什么?

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

示例 1 不会打印 inner,因为您从未对 inner 函数执行任何操作。您的装饰器应该返回 inner,而不是 funcinner 本身应该调用 func:

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

当你这样做时,你会得到这样的结果:

Running main()
Running inner
Running target

这就是您对装饰师的期望。