Python:带有包装器的装饰器的行为

时间:2014-08-11 13:49:09

标签: python wrapper decorator

我不明白为什么仅在第一次调用函数multiply(x,y)时执行“cache = {}”行。之后,该行被忽略。这使程序运行良好,但我不理解这种行为。

def memoize(func):

     cache = {}
     print("cache")

     @functools.wraps(func)
     def wrapper(*args):
         if args in cache:
             return cache[args]

         result = func(*args)
         cache[args] = result

         return result

     return wrapper

 @memoize
 def multiply(x, y):
     return x * y

 print(multiply(2, 3))
 print(multiply(2, 3))

结果是:

 cache
 6
 6

因此,行“cache = {}”和“print(”cache“)”仅在第一次执行时执行。 感谢

1 个答案:

答案 0 :(得分:1)

装饰器代码的一部分,每次执行""是包装函数。包装函数外部的代码仅在应用运算符时执行 -

这没有什么神奇之处或者#34;新的" - 只看到事物的顺序和什么时候被称为 - 正常的执行顺序中唯一被称为有点魔法的东西就是装饰本身 - 只记得:

 @memoize
 def multiply(x, y):
     return x * y

与以下内容完全相同:

def multiply(x, y):
     return x * y

multiply = memoize(multiply)

此外,如果您正在尝试了解装饰器,请暂时不要使用functools.wraps来电。它适用于生产代码和填充小细节:它将您的包装函数伪装成它所装饰的内部函数(例如,函数wrapper __name__属性设置为multiply在这个例子中),但在尝试理解装饰器时是不必要的复杂功能。