我有一个班级TimedCache(dict)
,每个值保留一个tuple(value, timestamp)
。
如何覆盖itervalues
函数以仅返回value
并忽略timestamp
。我仍然希望这是一个迭代器。
答案 0 :(得分:2)
您可能希望创建自己的MutableMapping(来自collections的抽象基类)以获得更高的一致性。
实现的唯一方法是__iter__
,__len__
,__getitem__
,__setitem__
和__delitem__
。
它们由以下方法使用(已实施):
__contains__
,keys
,items
,values
,iterkeys
,iteritems
,itervalues
,get
,{{ 1}}和__eq__
。
以下是根据任意条件过滤项目的字典示例:
__ne__
示例:
class FilteredDict(MutableMapping):
def accept(self, key):
# Only accept items with interger key and string value
return isinstance(key, int) and isinstance(self[key], str)
def __init__(self, *args, **kwargs):
self.dict = dict(*args, **kwargs)
def __getitem__(self, key):
return self.dict[key]
def __setitem__(self, key, value):
self.dict[key] = value
def __delitem__(self, key):
del self.dict[key]
def __len__(self):
return sum(1 for _ in self)
def __iter__(self):
for key in self.dict:
if self.accept(key):
yield key
def __repr__(self):
return repr(dict(self))
def __str__(self):
return str(dict(self))
答案 1 :(得分:0)
我找到了解决方案,但我想知道是否有更好的解决方案:)
def itervalues(self):
for value, timestamp in super(TimedCache, self).itervalues():
if time.time() - timestamp <= self.ttl:
yield value