mirror of https://github.com/python/cpython
[3.13] gh-122311: Fix some error messages in pickle (GH-122386) (GH-122387)
(cherry picked from commit 3b034d26eb
)
Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
This commit is contained in:
parent
d113359341
commit
c26dd270f7
|
@ -314,16 +314,17 @@ class _Unframer:
|
||||||
# Tools used for pickling.
|
# Tools used for pickling.
|
||||||
|
|
||||||
def _getattribute(obj, name):
|
def _getattribute(obj, name):
|
||||||
|
top = obj
|
||||||
for subpath in name.split('.'):
|
for subpath in name.split('.'):
|
||||||
if subpath == '<locals>':
|
if subpath == '<locals>':
|
||||||
raise AttributeError("Can't get local attribute {!r} on {!r}"
|
raise AttributeError("Can't get local attribute {!r} on {!r}"
|
||||||
.format(name, obj))
|
.format(name, top))
|
||||||
try:
|
try:
|
||||||
parent = obj
|
parent = obj
|
||||||
obj = getattr(obj, subpath)
|
obj = getattr(obj, subpath)
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
raise AttributeError("Can't get attribute {!r} on {!r}"
|
raise AttributeError("Can't get attribute {!r} on {!r}"
|
||||||
.format(name, obj)) from None
|
.format(name, top)) from None
|
||||||
return obj, parent
|
return obj, parent
|
||||||
|
|
||||||
def whichmodule(obj, name):
|
def whichmodule(obj, name):
|
||||||
|
@ -832,7 +833,7 @@ class _Pickler:
|
||||||
if _HAVE_PICKLE_BUFFER:
|
if _HAVE_PICKLE_BUFFER:
|
||||||
def save_picklebuffer(self, obj):
|
def save_picklebuffer(self, obj):
|
||||||
if self.proto < 5:
|
if self.proto < 5:
|
||||||
raise PicklingError("PickleBuffer can only pickled with "
|
raise PicklingError("PickleBuffer can only be pickled with "
|
||||||
"protocol >= 5")
|
"protocol >= 5")
|
||||||
with obj.raw() as m:
|
with obj.raw() as m:
|
||||||
if not m.contiguous:
|
if not m.contiguous:
|
||||||
|
|
|
@ -1982,8 +1982,10 @@ class AbstractPicklingErrorTests:
|
||||||
pb = pickle.PickleBuffer(b"foobar")
|
pb = pickle.PickleBuffer(b"foobar")
|
||||||
for proto in range(0, 5):
|
for proto in range(0, 5):
|
||||||
with self.subTest(proto=proto):
|
with self.subTest(proto=proto):
|
||||||
with self.assertRaises(pickle.PickleError):
|
with self.assertRaises(pickle.PickleError) as cm:
|
||||||
self.dumps(pb, proto)
|
self.dumps(pb, proto)
|
||||||
|
self.assertEqual(str(cm.exception),
|
||||||
|
'PickleBuffer can only be pickled with protocol >= 5')
|
||||||
|
|
||||||
def test_non_continuous_buffer(self):
|
def test_non_continuous_buffer(self):
|
||||||
if self.pickler is pickle._Pickler:
|
if self.pickler is pickle._Pickler:
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Fix some error messages in :mod:`pickle`.
|
|
@ -1817,10 +1817,10 @@ get_dotted_path(PyObject *obj, PyObject *name)
|
||||||
if (_PyUnicode_EqualToASCIIString(subpath, "<locals>")) {
|
if (_PyUnicode_EqualToASCIIString(subpath, "<locals>")) {
|
||||||
if (obj == NULL)
|
if (obj == NULL)
|
||||||
PyErr_Format(PyExc_AttributeError,
|
PyErr_Format(PyExc_AttributeError,
|
||||||
"Can't pickle local object %R", name);
|
"Can't get local object %R", name);
|
||||||
else
|
else
|
||||||
PyErr_Format(PyExc_AttributeError,
|
PyErr_Format(PyExc_AttributeError,
|
||||||
"Can't pickle local attribute %R on %R", name, obj);
|
"Can't get local attribute %R on %R", name, obj);
|
||||||
Py_DECREF(dotted_path);
|
Py_DECREF(dotted_path);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -2507,7 +2507,7 @@ save_picklebuffer(PickleState *st, PicklerObject *self, PyObject *obj)
|
||||||
{
|
{
|
||||||
if (self->proto < 5) {
|
if (self->proto < 5) {
|
||||||
PyErr_SetString(st->PicklingError,
|
PyErr_SetString(st->PicklingError,
|
||||||
"PickleBuffer can only pickled with protocol >= 5");
|
"PickleBuffer can only be pickled with protocol >= 5");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
const Py_buffer* view = PyPickleBuffer_GetBuffer(obj);
|
const Py_buffer* view = PyPickleBuffer_GetBuffer(obj);
|
||||||
|
|
Loading…
Reference in New Issue