Skip to main content
 首页 » 编程设计

python之python装饰器如何与递归一起工作

2025年05月04日36tintown

我有下面的代码

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 仍会被打印出来。