[英]Python: Generators and decorators with for a dictionary
我创建了一个问题,该问题行使了一个人在Python中使用生成器,装饰器和字典的能力。
但是,我自己无法解决此问题,并且想知道是否有可能解决。
是否可以使用包装生成器的装饰器函数以字典的形式缓存函数输出?
练习是:
编写装饰器以缓存函数调用结果。 将对arg:result存储在功能对象属性的字典中。 使用生成器函数生成这些结果。在fibonacci函数上测试代码。
我试图实现它如下:
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'
有人知道这样的问题的替代解决方案吗?
错误在这里:
return {func.__name__ + '(' + str(list(args))[1:-1] + ')' : str(result)}
我想返回结果时要返回字典。 我不太了解您实际上在缓存功能中在哪里进行任何缓存。
这种缓存模式通常也称为记忆。
试试这个http://avinashv.net/2008/04/python-decorators-syntactic-sugar/ 。 向下滚动到有关斐波那契的部分。 在此找到以下代码:
class memoize:
def __init__(self, function):
self.function = function
self.func_name = function.__name__
self.memoized = {}
def __call__(self, *args):
try:
print "Using Memo Solution for " + self.func_name + " on " + str(args)
return self.memoized[args]
except KeyError:
print "Computing Solution Now for " + self.func_name + " on " + str(args)
self.memoized[args] = self.function(*args)
return self.memoized[args]
然后只需执行以下操作:
@memoize
def fibonacci(n):
assert n >= 0
if n < 2:
return n
else:
return (fibonacci(n-1) + fibonacci(n-2))
在您的示例中,记忆仍然可以在生成器上进行,请注意,打印语句显示已获取记忆的结果。
class memoize:
def __init__(self, function):
self.function = function
self.func_name = function.__name__
self.memoized = {}
def __call__(self, *args):
try:
print "Using Memo Solution for " + self.func_name + " on " + str(args)
return self.memoized[args]
except KeyError:
print "Computing Solution Now for " + self.func_name + " on " + str(args)
self.memoized[args] = self.function(*args)
return self.memoized[args]
@memoize
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.