您可以擴展默認字典,並使用__missing__
方法來調用加載功能,如果關鍵是丟失:(裝入只在關鍵尚不存在發生)
class ImageDict(dict):
def __missing__(self, key):
self[key] = img = self.load(key)
return img
def load(self, key):
# create a queue if not exist (could be moved to __init__)
if not hasattr(self, '_queue'):
self._queue = []
# pop the oldest entry in the list and the dict
if len(self._queue) >= 100:
self.pop(self._queue.pop(0))
# append this key as a newest entry in the queue
self._queue.append(key)
# implement image loading here and return the image instance
print 'loading', key
return 'Image for %s' % key
和輸出
>>> d = ImageDict()
>>> d[3]
loading 3
'Image for 3'
>>> d[3]
'Image for 3'
>>> d['bleh']
loading bleh
'Image for bleh'
>>> d['bleh']
'Image for bleh'
一個演變將是t o只存儲字典中的最後一個元素,並清除最舊的條目。您可以通過保存用於排序的鍵列表來實現它。
擺脫'__getitem__'並將加載重命名爲'__missing__',你應該沒問題。 – PaulMcG 2012-01-03 15:50:13
您在'__missing__'中所做的所有事情都是爲鍵返回適當的值,或者引發異常。調用'__missing__'的'dict'代碼將負責更新字典(您的類繼承自此)。要添加對「最後n個元素」的支持,請將鍵列表添加爲成員,並將該鍵添加到'__missing__'列表的末尾。當列表超過n時,從列表中彈出最早的第(0)個鍵。 – PaulMcG 2012-01-03 16:05:57
謝謝保羅,不知道'__missing__',非常好! – tito 2012-01-03 17:28:28