[英]How python decorator works with recursion?
我有以下代码
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
是什么导致此行为?
这是正确的行为,与递归无关。
调用装饰器时会打印MEMO,这会在将其应用于函数时发生 ; 即在定义时间。 如果您从未调用过fib()
,则仍会打印MEMO。
仅在应用装饰器时打印MEMO
。 它不是wrapper
函数的一部分,而wrapper
函数是wrapper
器用来替换原始函数的结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.