diff --git a/Lib/collections.py b/Lib/collections.py index 202b8b2a90a..1e807af81dc 100644 --- a/Lib/collections.py +++ b/Lib/collections.py @@ -99,16 +99,14 @@ class OrderedDict(dict, MutableMapping): def __reduce__(self): 'Return state information for pickling' - dictitems = self.iteritems() + items = [[k, self[k]] for k in self] tmp = self.__map, self.__root del self.__map, self.__root inst_dict = vars(self).copy() self.__map, self.__root = tmp - # Set the state item to None when the dictionary is empty. This saves - # about 2 opcodes when the object is pickled. - if not inst_dict: - inst_dict = None - return (self.__class__, (), inst_dict, None, dictitems) + if inst_dict: + return (self.__class__, (items,), inst_dict) + return self.__class__, (items,) setdefault = MutableMapping.setdefault update = MutableMapping.update diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py index b108f9588c2..1c498765897 100644 --- a/Lib/test/test_collections.py +++ b/Lib/test/test_collections.py @@ -795,9 +795,9 @@ class TestOrderedDict(unittest.TestCase): # do not save instance dictionary if not needed pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)] od = OrderedDict(pairs) + self.assertEqual(len(od.__reduce__()), 2) od.x = 10 - self.assertGreaterEqual(len(od.__reduce__()), 2) - self.assertLessEqual(len(od.__reduce__()), 5) + self.assertEqual(len(od.__reduce__()), 3) def test_repr(self): od = OrderedDict([('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)])