]> granicus.if.org Git - python/commitdiff
Real pickling for bytes.
authorGuido van Rossum <guido@python.org>
Wed, 11 Apr 2007 05:40:58 +0000 (05:40 +0000)
committerGuido van Rossum <guido@python.org>
Wed, 11 Apr 2007 05:40:58 +0000 (05:40 +0000)
Restore complex pickling.
Use cPickle in io.py.

Lib/copy_reg.py
Lib/io.py
Objects/bytesobject.c

index 8760e620f9ba461d05ce8a79c4a969bc17c20e14..f4661edf4137600fb65599dff269b4be89e1dc50 100644 (file)
@@ -23,12 +23,18 @@ def constructor(object):
     if not callable(object):
         raise TypeError("constructors must be callable")
 
-# Example: provide pickling support for bytes objects.
+# Example: provide pickling support for complex numbers.
 
-def _pickle_bytes(b):
-    return bytes, (str(b),)
+try:
+    complex
+except NameError:
+    pass
+else:
 
-pickle(bytes, _pickle_bytes)
+    def pickle_complex(c):
+        return complex, (c.real, c.imag)
+
+    pickle(complex, pickle_complex, complex)
 
 # Support for pickling new-style objects
 
index b2860f4d4699c90d90b4d84987574fdfad7b3042..fd39826ae0d1f32d04d4e9ad0733de8d5ee0fd27 100644 (file)
--- a/Lib/io.py
+++ b/Lib/io.py
@@ -30,10 +30,14 @@ __all__ = ["BlockingIOError", "open", "IOBase", "RawIOBase", "FileIO",
 import os
 import sys
 import codecs
-import pickle
 import _fileio
 import warnings
 
+try:
+    import cPickle as pickle
+except ImportError:
+    import pickle
+
 # XXX Shouldn't we use st_blksize whenever we can?
 DEFAULT_BUFFER_SIZE = 8 * 1024  # bytes
 
index d985fc75e36bdfd0b84052df947c540c54a44e1e..be3da7a62c833dd3b261340edda225fa72ec2fa5 100644 (file)
@@ -2598,6 +2598,17 @@ bytes_fromhex(PyObject *cls, PyObject *args)
     return NULL;
 }
 
+PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
+
+static PyObject *
+bytes_reduce(PyBytesObject *self)
+{
+    return Py_BuildValue("(O(s#))",
+                         self->ob_type,
+                         self->ob_bytes == NULL ? "" : self->ob_bytes,
+                         self->ob_size);
+}
+
 static PySequenceMethods bytes_as_sequence = {
     (lenfunc)bytes_length,              /* sq_length */
     (binaryfunc)bytes_concat,           /* sq_concat */
@@ -2650,8 +2661,10 @@ bytes_methods[] = {
     {"remove", (PyCFunction)bytes_remove, METH_O, remove__doc__},
     {"decode", (PyCFunction)bytes_decode, METH_VARARGS, decode_doc},
     {"__alloc__", (PyCFunction)bytes_alloc, METH_NOARGS, alloc_doc},
-    {"fromhex", (PyCFunction)bytes_fromhex, METH_VARARGS|METH_CLASS, fromhex_doc},
+    {"fromhex", (PyCFunction)bytes_fromhex, METH_VARARGS|METH_CLASS,
+     fromhex_doc},
     {"join", (PyCFunction)bytes_join, METH_O|METH_CLASS, join_doc},
+    {"__reduce__", (PyCFunction)bytes_reduce, METH_NOARGS, reduce_doc},
     {NULL}
 };