【问题标题】:Python: behaviour of decorator with wrapperPython:带有包装器的装饰器的行为
【发布时间】:2014-10-04 09:00:45
【问题描述】:

我不明白为什么只有在我第一次调用函数 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”)”这行只在第一次执行。 谢谢

【问题讨论】:

  • "第一次调用函数multiply(x, y)时执行cache = {}" 错误。该行是在您调用multiply 之前执行之前

标签: python wrapper decorator


【解决方案1】:

装饰器代码中“每次都执行”的部分是包装函数。仅在应用运算符时执行该包装函数之外的代码 -

这没什么神奇或“新”——只要看看事情的顺序和什么时候被调用——唯一不正常的执行顺序被称为有点神奇的是装饰本身——请记住:

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

与以下内容相同:

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

multiply = memoize(multiply)

另外,如果您想了解装饰器,请暂时不要使用 functools.wraps 调用。它适用于生产代码和填充小细节:它将您的包装函数伪装成它装饰的内部函数(例如,函数wrapper__name__attribute 在本例中设置为multiply),但是在尝试理解装饰器时是不必要的复杂化。

【讨论】:

  • 这个例子我现在明白了。应用运算符时执行“cache = {}”行。然后只有包装函数。谢谢
  • 另外我也明白原函数的一些信息是用functools.wraps(func)保留的。
猜你喜欢
  • 1970-01-01
  • 2021-05-20
  • 1970-01-01
  • 2014-02-16
  • 2014-07-21
  • 2020-06-15
  • 2011-05-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多