python decorator如何与递归一起工作?

时间:2015-12-02 11:32:52

标签: python recursion decorator python-decorators

我有以下代码

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

导致此行为的原因是什么?

2 个答案:

答案 0 :(得分:3)

这是正确的行为,与递归无关。

当调用装饰器时会打印MEMO,当它应用于函数时会发生 ;即,在定义时间。如果你从未打过fib(),那么MEMO仍会被打印出来。

答案 1 :(得分:2)

您只能在应用装饰器时打印MEMO。它不是wrapper函数的一部分,它是装饰器替换原始函数所产生的函数。