bpo-33138: Change standard error message for non-pickleable and non-copyable types. (GH-6239)
This commit is contained in:
parent
3f819ca138
commit
0353b4eaaf
|
@ -814,8 +814,7 @@ class _BufferedIOMixin(BufferedIOBase):
|
||||||
return self.raw.mode
|
return self.raw.mode
|
||||||
|
|
||||||
def __getstate__(self):
|
def __getstate__(self):
|
||||||
raise TypeError("can not serialize a '{0}' object"
|
raise TypeError(f"cannot pickle {self.__class__.__name__!r} object")
|
||||||
.format(self.__class__.__name__))
|
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
modname = self.__class__.__module__
|
modname = self.__class__.__module__
|
||||||
|
@ -1554,7 +1553,7 @@ class FileIO(RawIOBase):
|
||||||
self.close()
|
self.close()
|
||||||
|
|
||||||
def __getstate__(self):
|
def __getstate__(self):
|
||||||
raise TypeError("cannot serialize '%s' object", self.__class__.__name__)
|
raise TypeError(f"cannot pickle {self.__class__.__name__!r} object")
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
class_name = '%s.%s' % (self.__class__.__module__,
|
class_name = '%s.%s' % (self.__class__.__module__,
|
||||||
|
|
|
@ -53,7 +53,8 @@ _HEAPTYPE = 1<<9
|
||||||
|
|
||||||
def _reduce_ex(self, proto):
|
def _reduce_ex(self, proto):
|
||||||
assert proto < 2
|
assert proto < 2
|
||||||
for base in self.__class__.__mro__:
|
cls = self.__class__
|
||||||
|
for base in cls.__mro__:
|
||||||
if hasattr(base, '__flags__') and not base.__flags__ & _HEAPTYPE:
|
if hasattr(base, '__flags__') and not base.__flags__ & _HEAPTYPE:
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
|
@ -61,16 +62,18 @@ def _reduce_ex(self, proto):
|
||||||
if base is object:
|
if base is object:
|
||||||
state = None
|
state = None
|
||||||
else:
|
else:
|
||||||
if base is self.__class__:
|
if base is cls:
|
||||||
raise TypeError("can't pickle %s objects" % base.__name__)
|
raise TypeError(f"cannot pickle {cls.__name__!r} object")
|
||||||
state = base(self)
|
state = base(self)
|
||||||
args = (self.__class__, base, state)
|
args = (cls, base, state)
|
||||||
try:
|
try:
|
||||||
getstate = self.__getstate__
|
getstate = self.__getstate__
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
if getattr(self, "__slots__", None):
|
if getattr(self, "__slots__", None):
|
||||||
raise TypeError("a class that defines __slots__ without "
|
raise TypeError(f"cannot pickle {cls.__name__!r} object: "
|
||||||
"defining __getstate__ cannot be pickled") from None
|
f"a class that defines __slots__ without "
|
||||||
|
f"defining __getstate__ cannot be pickled "
|
||||||
|
f"with protocol {proto}") from None
|
||||||
try:
|
try:
|
||||||
dict = self.__dict__
|
dict = self.__dict__
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
|
|
|
@ -189,7 +189,7 @@ class socket(_socket.socket):
|
||||||
return s
|
return s
|
||||||
|
|
||||||
def __getstate__(self):
|
def __getstate__(self):
|
||||||
raise TypeError("Cannot serialize socket object")
|
raise TypeError(f"cannot pickle {self.__class__.__name__!r} object")
|
||||||
|
|
||||||
def dup(self):
|
def dup(self):
|
||||||
"""dup() -> socket object
|
"""dup() -> socket object
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Changed standard error message for non-pickleable and non-copyable types. It
|
||||||
|
now says "cannot pickle" instead of "can't pickle" or "cannot serialize".
|
|
@ -264,14 +264,6 @@ _bz2_BZ2Compressor_flush_impl(BZ2Compressor *self)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
|
||||||
BZ2Compressor_getstate(BZ2Compressor *self, PyObject *noargs)
|
|
||||||
{
|
|
||||||
PyErr_Format(PyExc_TypeError, "cannot serialize '%s' object",
|
|
||||||
Py_TYPE(self)->tp_name);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void*
|
static void*
|
||||||
BZ2_Malloc(void* ctx, int items, int size)
|
BZ2_Malloc(void* ctx, int items, int size)
|
||||||
{
|
{
|
||||||
|
@ -347,7 +339,6 @@ BZ2Compressor_dealloc(BZ2Compressor *self)
|
||||||
static PyMethodDef BZ2Compressor_methods[] = {
|
static PyMethodDef BZ2Compressor_methods[] = {
|
||||||
_BZ2_BZ2COMPRESSOR_COMPRESS_METHODDEF
|
_BZ2_BZ2COMPRESSOR_COMPRESS_METHODDEF
|
||||||
_BZ2_BZ2COMPRESSOR_FLUSH_METHODDEF
|
_BZ2_BZ2COMPRESSOR_FLUSH_METHODDEF
|
||||||
{"__getstate__", (PyCFunction)BZ2Compressor_getstate, METH_NOARGS},
|
|
||||||
{NULL}
|
{NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -612,14 +603,6 @@ _bz2_BZ2Decompressor_decompress_impl(BZ2Decompressor *self, Py_buffer *data,
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
|
||||||
BZ2Decompressor_getstate(BZ2Decompressor *self, PyObject *noargs)
|
|
||||||
{
|
|
||||||
PyErr_Format(PyExc_TypeError, "cannot serialize '%s' object",
|
|
||||||
Py_TYPE(self)->tp_name);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*[clinic input]
|
/*[clinic input]
|
||||||
_bz2.BZ2Decompressor.__init__
|
_bz2.BZ2Decompressor.__init__
|
||||||
|
|
||||||
|
@ -679,7 +662,6 @@ BZ2Decompressor_dealloc(BZ2Decompressor *self)
|
||||||
|
|
||||||
static PyMethodDef BZ2Decompressor_methods[] = {
|
static PyMethodDef BZ2Decompressor_methods[] = {
|
||||||
_BZ2_BZ2DECOMPRESSOR_DECOMPRESS_METHODDEF
|
_BZ2_BZ2DECOMPRESSOR_DECOMPRESS_METHODDEF
|
||||||
{"__getstate__", (PyCFunction)BZ2Decompressor_getstate, METH_NOARGS},
|
|
||||||
{NULL}
|
{NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -608,16 +608,6 @@ buffered_isatty(buffered *self, PyObject *Py_UNUSED(ignored))
|
||||||
return PyObject_CallMethodObjArgs(self->raw, _PyIO_str_isatty, NULL);
|
return PyObject_CallMethodObjArgs(self->raw, _PyIO_str_isatty, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Serialization */
|
|
||||||
|
|
||||||
static PyObject *
|
|
||||||
buffered_getstate(buffered *self, PyObject *Py_UNUSED(ignored))
|
|
||||||
{
|
|
||||||
PyErr_Format(PyExc_TypeError,
|
|
||||||
"cannot serialize '%s' object", Py_TYPE(self)->tp_name);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Forward decls */
|
/* Forward decls */
|
||||||
static PyObject *
|
static PyObject *
|
||||||
_bufferedwriter_flush_unlocked(buffered *);
|
_bufferedwriter_flush_unlocked(buffered *);
|
||||||
|
@ -2394,7 +2384,6 @@ static PyMethodDef bufferedreader_methods[] = {
|
||||||
{"fileno", (PyCFunction)buffered_fileno, METH_NOARGS},
|
{"fileno", (PyCFunction)buffered_fileno, METH_NOARGS},
|
||||||
{"isatty", (PyCFunction)buffered_isatty, METH_NOARGS},
|
{"isatty", (PyCFunction)buffered_isatty, METH_NOARGS},
|
||||||
{"_dealloc_warn", (PyCFunction)buffered_dealloc_warn, METH_O},
|
{"_dealloc_warn", (PyCFunction)buffered_dealloc_warn, METH_O},
|
||||||
{"__getstate__", (PyCFunction)buffered_getstate, METH_NOARGS},
|
|
||||||
|
|
||||||
_IO__BUFFERED_READ_METHODDEF
|
_IO__BUFFERED_READ_METHODDEF
|
||||||
_IO__BUFFERED_PEEK_METHODDEF
|
_IO__BUFFERED_PEEK_METHODDEF
|
||||||
|
@ -2485,7 +2474,6 @@ static PyMethodDef bufferedwriter_methods[] = {
|
||||||
{"fileno", (PyCFunction)buffered_fileno, METH_NOARGS},
|
{"fileno", (PyCFunction)buffered_fileno, METH_NOARGS},
|
||||||
{"isatty", (PyCFunction)buffered_isatty, METH_NOARGS},
|
{"isatty", (PyCFunction)buffered_isatty, METH_NOARGS},
|
||||||
{"_dealloc_warn", (PyCFunction)buffered_dealloc_warn, METH_O},
|
{"_dealloc_warn", (PyCFunction)buffered_dealloc_warn, METH_O},
|
||||||
{"__getstate__", (PyCFunction)buffered_getstate, METH_NOARGS},
|
|
||||||
|
|
||||||
_IO_BUFFEREDWRITER_WRITE_METHODDEF
|
_IO_BUFFEREDWRITER_WRITE_METHODDEF
|
||||||
_IO__BUFFERED_TRUNCATE_METHODDEF
|
_IO__BUFFERED_TRUNCATE_METHODDEF
|
||||||
|
@ -2579,8 +2567,6 @@ static PyMethodDef bufferedrwpair_methods[] = {
|
||||||
{"close", (PyCFunction)bufferedrwpair_close, METH_NOARGS},
|
{"close", (PyCFunction)bufferedrwpair_close, METH_NOARGS},
|
||||||
{"isatty", (PyCFunction)bufferedrwpair_isatty, METH_NOARGS},
|
{"isatty", (PyCFunction)bufferedrwpair_isatty, METH_NOARGS},
|
||||||
|
|
||||||
{"__getstate__", (PyCFunction)buffered_getstate, METH_NOARGS},
|
|
||||||
|
|
||||||
{NULL, NULL}
|
{NULL, NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -2652,7 +2638,6 @@ static PyMethodDef bufferedrandom_methods[] = {
|
||||||
{"fileno", (PyCFunction)buffered_fileno, METH_NOARGS},
|
{"fileno", (PyCFunction)buffered_fileno, METH_NOARGS},
|
||||||
{"isatty", (PyCFunction)buffered_isatty, METH_NOARGS},
|
{"isatty", (PyCFunction)buffered_isatty, METH_NOARGS},
|
||||||
{"_dealloc_warn", (PyCFunction)buffered_dealloc_warn, METH_O},
|
{"_dealloc_warn", (PyCFunction)buffered_dealloc_warn, METH_O},
|
||||||
{"__getstate__", (PyCFunction)buffered_getstate, METH_NOARGS},
|
|
||||||
|
|
||||||
{"flush", (PyCFunction)buffered_flush, METH_NOARGS},
|
{"flush", (PyCFunction)buffered_flush, METH_NOARGS},
|
||||||
|
|
||||||
|
|
|
@ -1120,14 +1120,6 @@ _io_FileIO_isatty_impl(fileio *self)
|
||||||
return PyBool_FromLong(res);
|
return PyBool_FromLong(res);
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
|
||||||
fileio_getstate(fileio *self, PyObject *Py_UNUSED(ignored))
|
|
||||||
{
|
|
||||||
PyErr_Format(PyExc_TypeError,
|
|
||||||
"cannot serialize '%s' object", Py_TYPE(self)->tp_name);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
#include "clinic/fileio.c.h"
|
#include "clinic/fileio.c.h"
|
||||||
|
|
||||||
static PyMethodDef fileio_methods[] = {
|
static PyMethodDef fileio_methods[] = {
|
||||||
|
@ -1145,7 +1137,6 @@ static PyMethodDef fileio_methods[] = {
|
||||||
_IO_FILEIO_FILENO_METHODDEF
|
_IO_FILEIO_FILENO_METHODDEF
|
||||||
_IO_FILEIO_ISATTY_METHODDEF
|
_IO_FILEIO_ISATTY_METHODDEF
|
||||||
{"_dealloc_warn", (PyCFunction)fileio_dealloc_warn, METH_O, NULL},
|
{"_dealloc_warn", (PyCFunction)fileio_dealloc_warn, METH_O, NULL},
|
||||||
{"__getstate__", (PyCFunction)fileio_getstate, METH_NOARGS, NULL},
|
|
||||||
{NULL, NULL} /* sentinel */
|
{NULL, NULL} /* sentinel */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -2891,14 +2891,6 @@ _io_TextIOWrapper_isatty_impl(textio *self)
|
||||||
return _PyObject_CallMethodId(self->buffer, &PyId_isatty, NULL);
|
return _PyObject_CallMethodId(self->buffer, &PyId_isatty, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
|
||||||
textiowrapper_getstate(textio *self, PyObject *args)
|
|
||||||
{
|
|
||||||
PyErr_Format(PyExc_TypeError,
|
|
||||||
"cannot serialize '%s' object", Py_TYPE(self)->tp_name);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*[clinic input]
|
/*[clinic input]
|
||||||
_io.TextIOWrapper.flush
|
_io.TextIOWrapper.flush
|
||||||
[clinic start generated code]*/
|
[clinic start generated code]*/
|
||||||
|
@ -3132,7 +3124,6 @@ static PyMethodDef textiowrapper_methods[] = {
|
||||||
_IO_TEXTIOWRAPPER_READABLE_METHODDEF
|
_IO_TEXTIOWRAPPER_READABLE_METHODDEF
|
||||||
_IO_TEXTIOWRAPPER_WRITABLE_METHODDEF
|
_IO_TEXTIOWRAPPER_WRITABLE_METHODDEF
|
||||||
_IO_TEXTIOWRAPPER_ISATTY_METHODDEF
|
_IO_TEXTIOWRAPPER_ISATTY_METHODDEF
|
||||||
{"__getstate__", (PyCFunction)textiowrapper_getstate, METH_NOARGS},
|
|
||||||
|
|
||||||
_IO_TEXTIOWRAPPER_SEEK_METHODDEF
|
_IO_TEXTIOWRAPPER_SEEK_METHODDEF
|
||||||
_IO_TEXTIOWRAPPER_TELL_METHODDEF
|
_IO_TEXTIOWRAPPER_TELL_METHODDEF
|
||||||
|
|
|
@ -1060,14 +1060,6 @@ _io__WindowsConsoleIO_isatty_impl(winconsoleio *self)
|
||||||
Py_RETURN_TRUE;
|
Py_RETURN_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
|
||||||
winconsoleio_getstate(winconsoleio *self, PyObject *Py_UNUSED(ignored))
|
|
||||||
{
|
|
||||||
PyErr_Format(PyExc_TypeError,
|
|
||||||
"cannot serialize '%s' object", Py_TYPE(self)->tp_name);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
#include "clinic/winconsoleio.c.h"
|
#include "clinic/winconsoleio.c.h"
|
||||||
|
|
||||||
static PyMethodDef winconsoleio_methods[] = {
|
static PyMethodDef winconsoleio_methods[] = {
|
||||||
|
@ -1080,7 +1072,6 @@ static PyMethodDef winconsoleio_methods[] = {
|
||||||
_IO__WINDOWSCONSOLEIO_WRITABLE_METHODDEF
|
_IO__WINDOWSCONSOLEIO_WRITABLE_METHODDEF
|
||||||
_IO__WINDOWSCONSOLEIO_FILENO_METHODDEF
|
_IO__WINDOWSCONSOLEIO_FILENO_METHODDEF
|
||||||
_IO__WINDOWSCONSOLEIO_ISATTY_METHODDEF
|
_IO__WINDOWSCONSOLEIO_ISATTY_METHODDEF
|
||||||
{"__getstate__", (PyCFunction)winconsoleio_getstate, METH_NOARGS, NULL},
|
|
||||||
{NULL, NULL} /* sentinel */
|
{NULL, NULL} /* sentinel */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -591,14 +591,6 @@ _lzma_LZMACompressor_flush_impl(Compressor *self)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
|
||||||
Compressor_getstate(Compressor *self, PyObject *noargs)
|
|
||||||
{
|
|
||||||
PyErr_Format(PyExc_TypeError, "cannot serialize '%s' object",
|
|
||||||
Py_TYPE(self)->tp_name);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
Compressor_init_xz(lzma_stream *lzs, int check, uint32_t preset,
|
Compressor_init_xz(lzma_stream *lzs, int check, uint32_t preset,
|
||||||
PyObject *filterspecs)
|
PyObject *filterspecs)
|
||||||
|
@ -794,7 +786,6 @@ Compressor_dealloc(Compressor *self)
|
||||||
static PyMethodDef Compressor_methods[] = {
|
static PyMethodDef Compressor_methods[] = {
|
||||||
_LZMA_LZMACOMPRESSOR_COMPRESS_METHODDEF
|
_LZMA_LZMACOMPRESSOR_COMPRESS_METHODDEF
|
||||||
_LZMA_LZMACOMPRESSOR_FLUSH_METHODDEF
|
_LZMA_LZMACOMPRESSOR_FLUSH_METHODDEF
|
||||||
{"__getstate__", (PyCFunction)Compressor_getstate, METH_NOARGS},
|
|
||||||
{NULL}
|
{NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1078,14 +1069,6 @@ _lzma_LZMADecompressor_decompress_impl(Decompressor *self, Py_buffer *data,
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
|
||||||
Decompressor_getstate(Decompressor *self, PyObject *noargs)
|
|
||||||
{
|
|
||||||
PyErr_Format(PyExc_TypeError, "cannot serialize '%s' object",
|
|
||||||
Py_TYPE(self)->tp_name);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
Decompressor_init_raw(lzma_stream *lzs, PyObject *filterspecs)
|
Decompressor_init_raw(lzma_stream *lzs, PyObject *filterspecs)
|
||||||
{
|
{
|
||||||
|
@ -1235,7 +1218,6 @@ Decompressor_dealloc(Decompressor *self)
|
||||||
|
|
||||||
static PyMethodDef Decompressor_methods[] = {
|
static PyMethodDef Decompressor_methods[] = {
|
||||||
_LZMA_LZMADECOMPRESSOR_DECOMPRESS_METHODDEF
|
_LZMA_LZMADECOMPRESSOR_DECOMPRESS_METHODDEF
|
||||||
{"__getstate__", (PyCFunction)Decompressor_getstate, METH_NOARGS},
|
|
||||||
{NULL}
|
{NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -4122,7 +4122,7 @@ _PyObject_GetState(PyObject *obj, int required)
|
||||||
|
|
||||||
if (required && obj->ob_type->tp_itemsize) {
|
if (required && obj->ob_type->tp_itemsize) {
|
||||||
PyErr_Format(PyExc_TypeError,
|
PyErr_Format(PyExc_TypeError,
|
||||||
"can't pickle %.200s objects",
|
"cannot pickle '%.200s' object",
|
||||||
Py_TYPE(obj)->tp_name);
|
Py_TYPE(obj)->tp_name);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -4163,7 +4163,7 @@ _PyObject_GetState(PyObject *obj, int required)
|
||||||
Py_DECREF(slotnames);
|
Py_DECREF(slotnames);
|
||||||
Py_DECREF(state);
|
Py_DECREF(state);
|
||||||
PyErr_Format(PyExc_TypeError,
|
PyErr_Format(PyExc_TypeError,
|
||||||
"can't pickle %.200s objects",
|
"cannot pickle '%.200s' object",
|
||||||
Py_TYPE(obj)->tp_name);
|
Py_TYPE(obj)->tp_name);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -4400,7 +4400,7 @@ reduce_newobj(PyObject *obj)
|
||||||
|
|
||||||
if (Py_TYPE(obj)->tp_new == NULL) {
|
if (Py_TYPE(obj)->tp_new == NULL) {
|
||||||
PyErr_Format(PyExc_TypeError,
|
PyErr_Format(PyExc_TypeError,
|
||||||
"can't pickle %.200s objects",
|
"cannot pickle '%.200s' object",
|
||||||
Py_TYPE(obj)->tp_name);
|
Py_TYPE(obj)->tp_name);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue