覆盖字典的 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']
我有一个 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']