python 装饰器如何处理这段代码?

How does python decorator work on this code?

我正在尝试了解 python 装饰器。在我写这段代码之前,我以为我了解装饰器。

def func():
     def wrapper(x):
        return x()
     return wrapper 

@func()
def b():
    return sum

a = b([1,2,5])
print a # Result: 8 How?

e = b # pass b function to variable e
f = e([3,4,8]) # called function b stored in variable e
print f # Result: 15
# I understand how 15 is derived here

您使用 func 作为装饰器 factory,它生成一个 称为 原始 b() 的装饰器产生装修效果。事情是这样的:

  • @func() 首先执行 func() ,然后使用 return 值作为装饰器。 func() returns wrapper,所以wrapper被用作装饰器。
  • wrapper(b)x = b,return集x()。所以装饰器的结果是b(),也就是sum。 Python 集 b = sum
  • 您在 b = sum 的位置调用了 b([1, 2, 5])。所以 sum([1, 2, 5]) 是 returned.

这里的重要部分是你使用 func 不是作为装饰器,而是作为装饰器工厂(调用它产生实际的装饰器),这增加了一个间接层。