我有一个函数叫做runquery
它调用数据库,然后逐行生成行。我写了一个 memoize 装饰器(或者更准确地说,我只是从这个计算器问题 https://stackoverflow.com/questions/3377258/memoization-handler/3377272#3377272)但在后续调用中它只会产生一个空序列,大概是因为生成器的值只能产生一次。
如何修改适用于 Python 生成器的记忆装饰器?我意识到我需要在某个时候将它存储在内存中,但我想在装饰器中处理这个问题而不是修改原始函数。
记忆功能的当前代码是:
def memoized(f):
# Warning: Doesn't work if f yields values
cache={}
def ret(*args):
if args in cache:
return cache[args]
else:
answer=f(*args)
cache[args]=answer
return answer
return ret
我意识到这是一个老问题,但对于那些想要完整解决方案的人来说:这是一个基于 jsbueno 的建议的问题:
from itertools import tee
from types import GeneratorType
Tee = tee([], 1)[0].__class__
def memoized(f):
cache={}
def ret(*args):
if args not in cache:
cache[args]=f(*args)
if isinstance(cache[args], (GeneratorType, Tee)):
# the original can't be used any more,
# so we need to change the cache as well
cache[args], r = tee(cache[args])
return r
return cache[args]
return ret
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)