[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:
Miss Islington (bot) 2024-07-29 11:27:14 +02:00 committed by GitHub
parent d113359341
commit c26dd270f7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 11 additions and 7 deletions

View File

@ -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:

View File

@ -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:

View File

@ -0,0 +1 @@
Fix some error messages in :mod:`pickle`.

View File

@ -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);