Show More
@@ -1341,6 +1341,28 b' class lrucachedict(object):' | |||||
1341 |
|
1341 | |||
1342 | return result |
|
1342 | return result | |
1343 |
|
1343 | |||
|
1344 | def popoldest(self): | |||
|
1345 | """Remove the oldest item from the cache. | |||
|
1346 | ||||
|
1347 | Returns the (key, value) describing the removed cache entry. | |||
|
1348 | """ | |||
|
1349 | if not self._cache: | |||
|
1350 | return | |||
|
1351 | ||||
|
1352 | # Walk the linked list backwards starting at tail node until we hit | |||
|
1353 | # a non-empty node. | |||
|
1354 | n = self._head.prev | |||
|
1355 | while n.key is _notset: | |||
|
1356 | n = n.prev | |||
|
1357 | ||||
|
1358 | key, value = n.key, n.value | |||
|
1359 | ||||
|
1360 | # And remove it from the cache and mark it as empty. | |||
|
1361 | del self._cache[n.key] | |||
|
1362 | n.markempty() | |||
|
1363 | ||||
|
1364 | return key, value | |||
|
1365 | ||||
1344 | def _movetohead(self, node): |
|
1366 | def _movetohead(self, node): | |
1345 | """Mark a node as the newest, making it the new head. |
|
1367 | """Mark a node as the newest, making it the new head. | |
1346 |
|
1368 |
@@ -172,5 +172,30 b' class testlrucachedict(unittest.TestCase' | |||||
172 | self.assertIn(key, d) |
|
172 | self.assertIn(key, d) | |
173 | self.assertEqual(d[key], 'v%s' % key) |
|
173 | self.assertEqual(d[key], 'v%s' % key) | |
174 |
|
174 | |||
|
175 | def testpopoldest(self): | |||
|
176 | d = util.lrucachedict(4) | |||
|
177 | d['a'] = 'va' | |||
|
178 | d['b'] = 'vb' | |||
|
179 | ||||
|
180 | self.assertEqual(len(d), 2) | |||
|
181 | self.assertEqual(d.popoldest(), ('a', 'va')) | |||
|
182 | self.assertEqual(len(d), 1) | |||
|
183 | self.assertEqual(d.popoldest(), ('b', 'vb')) | |||
|
184 | self.assertEqual(len(d), 0) | |||
|
185 | self.assertIsNone(d.popoldest()) | |||
|
186 | ||||
|
187 | d['a'] = 'va' | |||
|
188 | d['b'] = 'vb' | |||
|
189 | d['c'] = 'vc' | |||
|
190 | d['d'] = 'vd' | |||
|
191 | ||||
|
192 | self.assertEqual(d.popoldest(), ('a', 'va')) | |||
|
193 | self.assertEqual(len(d), 3) | |||
|
194 | for key in ('b', 'c', 'd'): | |||
|
195 | self.assertEqual(d[key], 'v%s' % key) | |||
|
196 | ||||
|
197 | d['a'] = 'va' | |||
|
198 | self.assertEqual(d.popoldest(), ('b', 'vb')) | |||
|
199 | ||||
175 | if __name__ == '__main__': |
|
200 | if __name__ == '__main__': | |
176 | silenttestrunner.main(__name__) |
|
201 | silenttestrunner.main(__name__) |
General Comments 0
You need to be logged in to leave comments.
Login now