diff --git a/Lib/_compat_pickle.py b/Lib/_compat_pickle.py --- a/Lib/_compat_pickle.py +++ b/Lib/_compat_pickle.py @@ -51,8 +51,6 @@ 'CGIHTTPServer': 'http.server', 'test.test_support': 'test.support', 'commands': 'subprocess', - 'UserString' : 'collections', - 'UserList' : 'collections', 'urlparse' : 'urllib.parse', 'robotparser' : 'urllib.robotparser', 'whichdb': 'dbm', @@ -74,6 +72,8 @@ ('itertools', 'imap'): ('builtins', 'map'), ('itertools', 'ifilter'): ('builtins', 'filter'), ('itertools', 'ifilterfalse'): ('itertools', 'filterfalse'), + ('UserList', 'UserList'): ('collections', 'UserList'), + ('UserString', 'UserString'): ('collections', 'UserString'), } PYTHON2_EXCEPTIONS = ( diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py --- a/Lib/test/pickletester.py +++ b/Lib/test/pickletester.py @@ -2,11 +2,11 @@ import io import pickle import pickletools -import random import struct import sys import unittest import weakref +import collections from http.cookies import SimpleCookie from test.support import ( @@ -1941,6 +1941,27 @@ s = bytes([0x58, 0, 0, 0, 0x54]) self.assertRaises(EOFError, pickle.loads, s) + def test_protocol_2_pickles_UserString_correctly(self): + output = io.StringIO() + p = pickle.dumps(collections.UserString(''), protocol=2) + pickletools.dis(p, out=output) + + self.assertIn('UserString UserString', output.getvalue()) + + def test_protocol_2_pickles_UserList_correctly(self): + output = io.StringIO() + p = pickle.dumps(collections.UserList(), protocol=2) + pickletools.dis(p, out=output) + + self.assertIn('UserList UserList', output.getvalue()) + + def test_protocol_2_does_not_try_to_correct_names_that_are_already_correct(self): + output = io.StringIO() + p = pickle.dumps(collections.defaultdict(), protocol=2) + pickletools.dis(p, out=output) + + self.assertIn('collections defaultdict', output.getvalue()) + class AbstractPersistentPicklerTests(unittest.TestCase):