簡體   English   中英

python裝飾器如何與遞歸一起工作?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM