summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2007-04-11 04:37:43 (GMT)
committerGuido van Rossum <guido@python.org>2007-04-11 04:37:43 (GMT)
commit0ad0812edb3b4023f3e410243c007fba3f84a9ff (patch)
tree23d6a6d06f6cbebbf8cf0f54508b68dc826ff791
parent9b76da6a8f93c0211a97187f000b693d0cdc6638 (diff)
downloadcpython-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.py14
-rw-r--r--Lib/test/test_bytes.py12
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.