Python装饰器检查函数是否在

时间:2016-03-05 17:24:28

标签: python

我需要创建一个装饰器来检查它之前调用的函数是否与之前调用的参数完全相同。如果是,我需要返回先前的输出。如果不是,我将其调用并存储结果以供将来调用。这就是我所拥有的:

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个。有什么想法吗?

1 个答案:

答案 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 的方法,因此您可以使用字典从参数(表示)映射到缓存值。这避免了必须遍历所有缓存条目。