diff -r 367f5e98ffbb Lib/_collections_abc.py --- a/Lib/_collections_abc.py Fri Feb 06 10:21:37 2015 +0200 +++ b/Lib/_collections_abc.py Fri Feb 06 11:55:39 2015 +0200 @@ -464,10 +464,15 @@ class MappingView(Sized): def __repr__(self): return '{0.__class__.__name__}({0._mapping!r})'.format(self) + def __reduce__(self): + method = getattr(self._mapping, self.__class__.fabric_method_name) + return method, () + class KeysView(MappingView, Set): __slots__ = () + fabric_method_name = 'keys' @classmethod def _from_iterable(self, it): @@ -485,6 +490,7 @@ KeysView.register(dict_keys) class ItemsView(MappingView, Set): __slots__ = () + fabric_method_name = 'items' @classmethod def _from_iterable(self, it): @@ -509,6 +515,7 @@ ItemsView.register(dict_items) class ValuesView(MappingView): __slots__ = () + fabric_method_name = 'values' def __contains__(self, value): for key in self._mapping: diff -r 367f5e98ffbb Lib/test/test_collections.py --- a/Lib/test/test_collections.py Fri Feb 06 10:21:37 2015 +0200 +++ b/Lib/test/test_collections.py Fri Feb 06 11:55:39 2015 +0200 @@ -1060,6 +1060,33 @@ class TestCollectionABCs(ABCTestCase): mss.clear() self.assertEqual(len(mss), 0) + def test_keys_pickle(self): + for cls in UserDict, OrderedDict: + d = cls([('a', 1), ('b', 2), ('c', 3)]) + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + with self.subTest(cls=cls, proto=proto): + d2, keys = pickle.loads(pickle.dumps((d, d.keys()), proto)) + self.assertEqual(type(keys), type(d2.keys())) + self.assertEqual(sorted(keys), sorted(d2.keys())) + + def test_values_pickle(self): + for cls in UserDict, OrderedDict: + d = cls([('a', 1), ('b', 2), ('c', 3)]) + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + with self.subTest(cls=cls, proto=proto): + d2, values = pickle.loads(pickle.dumps((d, d.values()), proto)) + self.assertEqual(type(values), type(d2.values())) + self.assertEqual(sorted(values), sorted(d2.values())) + + def test_items_pickle(self): + for cls in UserDict, OrderedDict: + d = cls([('a', 1), ('b', 2), ('c', 3)]) + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + with self.subTest(cls=cls, proto=proto): + d2, items = pickle.loads(pickle.dumps((d, d.items()), proto)) + self.assertEqual(type(items), type(d2.items())) + self.assertEqual(sorted(items), sorted(d2.items())) + ################################################################################ ### Counter ################################################################################