我需要创建一个装饰器来检查它之前调用的函数是否与之前调用的参数完全相同。如果是,我需要返回先前的输出。如果不是,我将其调用并存储结果以供将来调用。这就是我所拥有的:
class memoized(object):
def __init__(self,f):
self.__first=[]
self.__last=[]
self.__f=f
self.__name__=f.__name__
self.__value=[]
def __call__(self,*args,**dargs):
for i in self.__value:
if(self.__first[i]==args and self.__last[i]==dargs):
return self.__value[i]
rv=self.__f(*args,**dargs)
self.__first.append(args)
self.__last.append(dargs)
self.__value.append(rv)
return rv
当我运行它虽然它给我一个idex错误。我不知道为什么从理论上讲,第一个和最后一个值的长度应该始终相同,因为我追加到它们中的所有3个。有什么想法吗?
答案 0 :(得分:1)
您将返回值附加到self.__value
。迭代self.__value
然后给出那些返回值,而不是列表中的索引。
您可以使用zip()
来配对3个列表:
for a, kw, rv in zip(self.__value, self.__first, self.__last):
if(a==args and kw==dargs):
return rv
就实现而言,您也可以将位置和关键字参数附加到同一列表中。在这里创建3个单独的列表没有什么意义:
class memoized(object):
def __init__(self,f):
self.__cache = []
self.__f = f
self.__name__ = f.__name__
def __call__(self,*args,**dargs):
for a, kw, rv in self.__cache:
if(a == args and kw == dargs):
return rv
rv = self.__f(*args, **dargs)
self.__cache.append((args, dargs, rv))
return rv
您可能希望找到一种从位置和关键字参数创建 hashable key 的方法,因此您可以使用字典从参数(表示)映射到缓存值。这避免了必须遍历所有缓存条目。