我有以下代码
def memo(fn):
cache = {}
miss = object()
print 'MEMO'
def wrapper(*args):
result = cache.get(args, miss)
print 'IT CALLS'
if result is miss:
print 'IT MISSES'
result = fn(*args)
cache[args] = result
return result
return wrapper
@memo
def fib(n):
if n < 2:
return n
return fib(n - 1) + fib(n - 2)
当我调用fib(4)时,它只打印一次MEMO。以下是输出。
MEMO
IT CALLS
IT MISSES
IT CALLS
IT MISSES
IT CALLS
IT MISSES
IT CALLS
IT MISSES
IT CALLS
IT MISSES
IT CALLS
IT CALLS
导致此行为的原因是什么?
答案 0 :(得分:3)
这是正确的行为,与递归无关。
当调用装饰器时会打印MEMO,当它应用于函数时会发生 ;即,在定义时间。如果你从未打过fib()
,那么MEMO仍会被打印出来。
答案 1 :(得分:2)
您只能在应用装饰器时打印MEMO
。它不是wrapper
函数的一部分,它是装饰器替换原始函数所产生的函数。