[英]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.