繁体   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