]> granicus.if.org Git - python/commitdiff
An example of action-at-a-distance: fix the problems I had in test_io.py
authorGuido van Rossum <guido@python.org>
Wed, 11 Apr 2007 04:37:43 +0000 (04:37 +0000)
committerGuido van Rossum <guido@python.org>
Wed, 11 Apr 2007 04:37:43 +0000 (04:37 +0000)
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__.

Lib/copy_reg.py
Lib/test/test_bytes.py

index f4661edf4137600fb65599dff269b4be89e1dc50..8760e620f9ba461d05ce8a79c4a969bc17c20e14 100644 (file)
@@ -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
 
index e90bceeabc6b4fd79b43dba861fcac1f82744f3e..682f5d7fb3585bcc080de84c0c2bdd35e598d986 100644 (file)
@@ -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.