带语法糖和不带语法糖的Python decorator之间的区别?

带语法糖和不带语法糖的Python decorator之间的区别?,python,functional-programming,decorator,python-decorators,memoization,Python,Functional Programming,Decorator,Python Decorators,Memoization,我试图实现一个记忆任意函数的装饰器。看来我已经通过以下代码成功地实现了这一点: def memoize(func): cache = {} def wrapper(*args, **kwargs): acc = "" for arg in args: acc += str(arg) if acc in cache: return cache[acc] else:

我试图实现一个记忆任意函数的装饰器。看来我已经通过以下代码成功地实现了这一点:

def memoize(func):
    cache = {}
    def wrapper(*args, **kwargs):
        acc = ""
        for arg in args:
            acc += str(arg)
        if acc in cache:
            return cache[acc]
        else:
            cache[acc] = func(*args, **kwargs)
            return cache[acc]
    return wrapper

@memoize
def fib(n):
    if n == 0 or n == 1:
        return 1
    else:
        return fib(n - 1) + fib(n - 2)
然后
fib(100)
相当快地返回
573147844013817084101
。但是,如果我不使用语法糖:

def fib(n):
    if n == 0 or n == 1:
        return 1
    else:
        return fib(n - 1) + fib(n - 2)
memoized = memoize(fib)
print memoized(100)

函数挂起。在调试时,返回的包装器似乎无法修改缓存。有人能解释这种行为吗?据我所知,使用sugar和不使用sugar之间应该没有区别。

您的递归调用没有被记忆,因为您使用了一个新名称,而不是原来的
fib
函数名。每次
fib()
迭代都会调用
fib()
,但这将调用原始的未修饰函数

将decorator调用的返回值指定给
fib

def fib(n):
    if n == 0 or n == 1:
        return 1
    else:
        return fib(n - 1) + fib(n - 2)
fib = memoize(fib)
print fib(100)
或者,如果必须使用
memoize
作为装饰器结果的名称,请使用
fib()
调用
memoized()
进行递归调用:

def fib(n):
    if n == 0 or n == 1:
        return 1
    else:
        return memoized(n - 1) + memoizzed(n - 2)
memoized = memoized(fib)
print memoized(100)
记住,
@decorator
语法指定给相同的名称,而不是新名称。以下两项是等效的:

@memoize
def fib(n):
    # ....


除非名称
fib
从未首先绑定到原始函数。

您的递归调用不会被记忆,因为您使用的是新名称,而不是原始的
fib
函数名称。每次
fib()
迭代都会调用
fib()
,但这将调用原始的未修饰函数

将decorator调用的返回值指定给
fib

def fib(n):
    if n == 0 or n == 1:
        return 1
    else:
        return fib(n - 1) + fib(n - 2)
fib = memoize(fib)
print fib(100)
或者,如果必须使用
memoize
作为装饰器结果的名称,请使用
fib()
调用
memoized()
进行递归调用:

def fib(n):
    if n == 0 or n == 1:
        return 1
    else:
        return memoized(n - 1) + memoizzed(n - 2)
memoized = memoized(fib)
print memoized(100)
记住,
@decorator
语法指定给相同的名称,而不是新名称。以下两项是等效的:

@memoize
def fib(n):
    # ....

除非名称
fib
从未首先绑定到原始函数