diff --git a/Lib/copy_reg.py b/Lib/copy_reg.py index 8760e620f9b..f4661edf413 100644 --- a/Lib/copy_reg.py +++ b/Lib/copy_reg.py @@ -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 diff --git a/Lib/io.py b/Lib/io.py index b2860f4d469..fd39826ae0d 100644 --- 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 diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index d985fc75e36..be3da7a62c8 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -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} };