我创建了一个问题来锻炼一个人在 Python 中使用生成器、装饰器和字典的能力。
但是,我自己无法解决此练习,并且想知道是否有可能解决。
是否可以使用包装生成器的装饰器函数以字典的形式缓存函数输出?
练习是:
编写一个装饰器来缓存函数调用结果。将 arg:result 对存储在函数对象属性中的字典中。使用生成器函数生成这些结果 在斐波那契函数上测试您的代码。
我试图按如下方式实现它:
def cachefunc(func):
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
return {func.__name__ + '(' + str(list(args))[1:-1] + ')' : str(result)}
wrapper.__name__ = func.__name__
wrapper.__doc__ = func.__doc__
return wrapper
@cachefunc
def fibonacci(n):
assert n >= 0
if n < 2:
return n
else:
return (fibonacci(n-1) + fibonacci(n-2))
def allfib():
n = 0
while True:
yield fibonacci(n)
n += 1
result = []
generator = allfib()
while len(result) < 10:
x = next(generator)
result.append(x)
print result
但是,我收到以下错误:
python dg.py
Traceback (most recent call last):
File "dg.py", line 32, in <module>
x = next(generator)
File "dg.py", line 26, in allfib
yield fibonacci(n)
File "dg.py", line 10, in wrapper
result = func(*args, **kwargs)
File "dg.py", line 22, in fibonacci
return (fibonacci(n-1) + fibonacci(n-2))
TypeError: unsupported operand type(s) for +: 'dict' and 'dict'
有人知道这样的问题的替代解决方案吗?