Skip to content

Commit 7e8b153

Browse files
authored
pythongh-116436: Improve error message when TypeError occurs during dict update (python#116443)
1 parent 4e294f6 commit 7e8b153

File tree

3 files changed

+31
-4
lines changed

3 files changed

+31
-4
lines changed

Lib/test/test_dict.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,31 @@ def __next__(self):
266266

267267
self.assertRaises(ValueError, {}.update, [(1, 2, 3)])
268268

269+
def test_update_type_error(self):
270+
with self.assertRaises(TypeError) as cm:
271+
{}.update([object() for _ in range(3)])
272+
273+
self.assertEqual(str(cm.exception), "object is not iterable")
274+
self.assertEqual(
275+
cm.exception.__notes__,
276+
['Cannot convert dictionary update sequence element #0 to a sequence'],
277+
)
278+
279+
def badgen():
280+
yield "key"
281+
raise TypeError("oops")
282+
yield "value"
283+
284+
with self.assertRaises(TypeError) as cm:
285+
dict([badgen() for _ in range(3)])
286+
287+
self.assertEqual(str(cm.exception), "oops")
288+
self.assertEqual(
289+
cm.exception.__notes__,
290+
['Cannot convert dictionary update sequence element #0 to a sequence'],
291+
)
292+
293+
269294
def test_fromkeys(self):
270295
self.assertEqual(dict.fromkeys('abc'), {'a':None, 'b':None, 'c':None})
271296
d = {}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Improve error message when :exc:`TypeError` occurs during :meth:`dict.update`

Objects/dictobject.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3730,13 +3730,14 @@ merge_from_seq2_lock_held(PyObject *d, PyObject *seq2, int override)
37303730
}
37313731

37323732
/* Convert item to sequence, and verify length 2. */
3733-
fast = PySequence_Fast(item, "");
3733+
fast = PySequence_Fast(item, "object is not iterable");
37343734
if (fast == NULL) {
3735-
if (PyErr_ExceptionMatches(PyExc_TypeError))
3736-
PyErr_Format(PyExc_TypeError,
3737-
"cannot convert dictionary update "
3735+
if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3736+
_PyErr_FormatNote(
3737+
"Cannot convert dictionary update "
37383738
"sequence element #%zd to a sequence",
37393739
i);
3740+
}
37403741
goto Fail;
37413742
}
37423743
n = PySequence_Fast_GET_SIZE(fast);

0 commit comments

Comments
 (0)