Index: Lib/collections.py =================================================================== --- Lib/collections.py (revision 70128) +++ Lib/collections.py (working copy) @@ -23,11 +23,11 @@ if len(args) > 1: raise TypeError('expected at most 1 arguments, got %d' % len(args)) if not hasattr(self, '_keys'): - self._keys = [] + self._keys = deque() self.update(*args, **kwds) def clear(self): - del self._keys[:] + self._keys.clear() dict.clear(self) def __setitem__(self, key, value): @@ -52,6 +52,13 @@ value = dict.pop(self, key) return key, value + def pop_oldest_item(self): + if not self: + raise KeyError('dictionary is empty') + key = self._keys.popleft() + value = dict.pop(self, key) + return key, value + def __reduce__(self): items = [[k, self[k]] for k in self] inst_dict = vars(self).copy() Index: Lib/test/test_collections.py =================================================================== --- Lib/test/test_collections.py (revision 70128) +++ Lib/test/test_collections.py (working copy) @@ -665,6 +665,16 @@ od.popitem() self.assertEqual(len(od), 0) + def test_pop_oldest_item(self): + pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)] + shuffle(pairs) + od = OrderedDict(pairs) + while pairs: + self.assertEqual(od.pop_oldest_item(), pairs.pop(0)) + with self.assertRaises(KeyError): + od.pop_oldest_item() + self.assertEqual(len(od), 0) + def test_pop(self): pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)] shuffle(pairs)