Я пытаюсь реализовать декоратор, который запоминает произвольную функцию. Оказывается, я успешно выполнил это с помощью следующего кода:Разница между декоратором Python с синтаксическим сахаром и без него?
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)
Функция висит. Отлаживая его, похоже, что возвращенная оболочка не может изменить кеш. Может ли кто-нибудь объяснить это поведение? Насколько я знаю, не должно быть разницы между использованием сахара и использованием сахара.