覆盖字典的 itervalues

Override itervalues of dict

我有一个 class TimedCache(dict),每个值都有一个 tuple(value, timestamp)

如何将 itervalues 函数覆盖为 return 只有 value 而忽略 timestamp。我仍然希望这是一个迭代器。

我找到了解决办法,但我想知道有没有更好的:)

def itervalues(self):
    for value, timestamp in super(TimedCache, self).itervalues():
        if time.time() - timestamp <= self.ttl:
            yield value

您可能想要创建自己的 MutableMapping (an abstract base class from collections) 以获得更高的一致性。

唯一的实现方法是 __iter____len____getitem____setitem____delitem__

它们被以下方法使用(已实现): __contains__, keys, items, values, iterkeys, iteritems, itervalues, get, __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))

示例:

>>> fd = FilteredDict({1: 'a', 2: 'b',  '3': 'c', 4: 4})
>>> fd.dict
{1: 'a', 2: 'b', 4: 4, '3': 'c'}
>>> fd
{1: 'a', 2: 'b'}
>>> list(fd)
[1, 2]
>>> list(fd.itervalues())
['a', 'b']