Skip to content

Commit

Permalink
gh-122311: Fix some error messages in pickle
Browse files Browse the repository at this point in the history
  • Loading branch information
serhiy-storchaka committed Jul 29, 2024
1 parent 169e713 commit b064335
Show file tree
Hide file tree
Showing 4 changed files with 11 additions and 7 deletions.
7 changes: 4 additions & 3 deletions Lib/pickle.py
Original file line number Diff line number Diff line change
Expand Up @@ -314,16 +314,17 @@ def load_frame(self, frame_size):
# Tools used for pickling.

def _getattribute(obj, name):
top = obj
for subpath in name.split('.'):
if subpath == '<locals>':
raise AttributeError("Can't get local attribute {!r} on {!r}"
.format(name, obj))
.format(name, top))
try:
parent = obj
obj = getattr(obj, subpath)
except AttributeError:
raise AttributeError("Can't get attribute {!r} on {!r}"
.format(name, obj)) from None
.format(name, top)) from None
return obj, parent

def whichmodule(obj, name):
Expand Down Expand Up @@ -832,7 +833,7 @@ def save_bytearray(self, obj):
if _HAVE_PICKLE_BUFFER:
def save_picklebuffer(self, obj):
if self.proto < 5:
raise PicklingError("PickleBuffer can only pickled with "
raise PicklingError("PickleBuffer can only be pickled with "
"protocol >= 5")
with obj.raw() as m:
if not m.contiguous:
Expand Down
4 changes: 3 additions & 1 deletion Lib/test/pickletester.py
Original file line number Diff line number Diff line change
Expand Up @@ -1982,8 +1982,10 @@ def test_picklebuffer_error(self):
pb = pickle.PickleBuffer(b"foobar")
for proto in range(0, 5):
with self.subTest(proto=proto):
with self.assertRaises(pickle.PickleError):
with self.assertRaises(pickle.PickleError) as cm:
self.dumps(pb, proto)
self.assertEqual(str(cm.exception),
'PickleBuffer can only be pickled with protocol >= 5')

def test_non_continuous_buffer(self):
if self.pickler is pickle._Pickler:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix some error messages in :mod:`pickle`.
6 changes: 3 additions & 3 deletions Modules/_pickle.c
Original file line number Diff line number Diff line change
Expand Up @@ -1817,10 +1817,10 @@ get_dotted_path(PyObject *obj, PyObject *name)
if (_PyUnicode_EqualToASCIIString(subpath, "<locals>")) {
if (obj == NULL)
PyErr_Format(PyExc_AttributeError,
"Can't pickle local object %R", name);
"Can't get local object %R", name);
else
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);
return NULL;
}
Expand Down Expand Up @@ -2507,7 +2507,7 @@ save_picklebuffer(PickleState *st, PicklerObject *self, PyObject *obj)
{
if (self->proto < 5) {
PyErr_SetString(st->PicklingError,
"PickleBuffer can only pickled with protocol >= 5");
"PickleBuffer can only be pickled with protocol >= 5");
return -1;
}
const Py_buffer* view = PyPickleBuffer_GetBuffer(obj);
Expand Down

0 comments on commit b064335

Please sign in to comment.