繁体   English   中英

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

在Example1中,以及

Running inner
Running main()
Running target

在Example2中。

似乎Example1中丢失了“ Running内部”。 为什么?

运行示例2将得到该结果,因为在定义时执行了deco ,在该示例中,它立即打印了inner

示例1不会打印inner,因为您永远不会对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

这是您对装饰者的期望。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM