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
,而不是 func
; inner
本身应该调用 func:
def deco(func):
def inner():
print("Running inner")
func()
return inner # note change here
当你这样做时,你会得到这样的结果:
Running main()
Running inner
Running target
这就是您对装饰师的期望。
我最近学习了 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
,而不是 func
; inner
本身应该调用 func:
def deco(func):
def inner():
print("Running inner")
func()
return inner # note change here
当你这样做时,你会得到这样的结果:
Running main()
Running inner
Running target
这就是您对装饰师的期望。