diff --git a/Lib/copy_reg.py b/Lib/copy_reg.py index f4661edf413..8760e620f9b 100644 --- a/Lib/copy_reg.py +++ b/Lib/copy_reg.py @@ -23,18 +23,12 @@ def constructor(object): if not callable(object): raise TypeError("constructors must be callable") -# Example: provide pickling support for complex numbers. +# Example: provide pickling support for bytes objects. -try: - complex -except NameError: - pass -else: +def _pickle_bytes(b): + return bytes, (str(b),) - def pickle_complex(c): - return complex, (c.real, c.imag) - - pickle(complex, pickle_complex, complex) +pickle(bytes, _pickle_bytes) # Support for pickling new-style objects diff --git a/Lib/test/test_bytes.py b/Lib/test/test_bytes.py index e90bceeabc6..682f5d7fb35 100644 --- a/Lib/test/test_bytes.py +++ b/Lib/test/test_bytes.py @@ -3,6 +3,8 @@ import os import re import sys +import pickle +import cPickle import tempfile import unittest import test.test_support @@ -633,6 +635,14 @@ class BytesTest(unittest.TestCase): self.assertEqual(b.rpartition(b'ss'), (b'missi', b'ss', b'ippi')) self.assertEqual(b.rpartition(b'i'), (b'mississipp', b'i', b'')) + def test_pickling(self): + for pm in pickle, cPickle: + for proto in range(pm.HIGHEST_PROTOCOL): + for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0": + ps = pm.dumps(b, proto) + q = pm.loads(ps) + self.assertEqual(b, q) + # Optimizations: # __iter__? (optimization) # __reversed__? (optimization) @@ -640,8 +650,6 @@ class BytesTest(unittest.TestCase): # XXX Some string methods? (Those that don't use character properties) # lstrip, rstrip, strip?? (currently un-pepped) # join - - # XXX pickle and marshal support? # There are tests in string_tests.py that are more # comprehensive for things like split, partition, etc.