diff options
author | Guido van Rossum <guido@python.org> | 2007-04-11 04:37:43 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 2007-04-11 04:37:43 (GMT) |
commit | 0ad0812edb3b4023f3e410243c007fba3f84a9ff (patch) | |
tree | 23d6a6d06f6cbebbf8cf0f54508b68dc826ff791 | |
parent | 9b76da6a8f93c0211a97187f000b693d0cdc6638 (diff) | |
download | cpython-0ad0812edb3b4023f3e410243c007fba3f84a9ff.zip cpython-0ad0812edb3b4023f3e410243c007fba3f84a9ff.tar.gz cpython-0ad0812edb3b4023f3e410243c007fba3f84a9ff.tar.bz2 |
An example of action-at-a-distance: fix the problems I had in test_io.py
without touching io.py or test_io.py. The cause of the failure was that
bytes objects didn't pickle right. As a stop-gap measure, I'm providing
bytes pickling via copy_reg. Eventually, we should use a more efficient
protocol, e.g. __reduce_ex__ or __getstate__/__setstate__.
-rw-r--r-- | Lib/copy_reg.py | 14 | ||||
-rw-r--r-- | Lib/test/test_bytes.py | 12 |
2 files changed, 14 insertions, 12 deletions
diff --git a/Lib/copy_reg.py b/Lib/copy_reg.py index f4661ed..8760e62 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 e90bcee..682f5d7 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. |