覆盖dict的itervalues

时间:2015-08-27 14:00:08

标签: python dictionary built-in

我有一个班级TimedCache(dict),每个值保留一个tuple(value, timestamp)

如何覆盖itervalues函数以仅返回value并忽略timestamp。我仍然希望这是一个迭代器。

2 个答案:

答案 0 :(得分:2)

您可能希望创建自己的MutableMapping(来自collections的抽象基类)以获得更高的一致性。

实现的唯一方法是__iter____len____getitem____setitem____delitem__

它们由以下方法使用(已实施): __contains__keysitemsvaluesiterkeysiteritemsitervaluesget,{{ 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