Skip to content

Commit f07618a

Browse files
committed
gh-116436: Improve error message when TypeError occurs during dict update
1 parent 2e94a66 commit f07618a

File tree

2 files changed

+30
-4
lines changed

2 files changed

+30
-4
lines changed

Lib/test/test_dict.py

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

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

268+
def test_update_type_error(self):
269+
with self.assertRaises(TypeError) as cm:
270+
{}.update([object() for _ in range(3)])
271+
272+
self.assertEqual(str(cm.exception), "object is not iterable")
273+
self.assertEqual(
274+
cm.exception.__notes__,
275+
['Cannot convert dictionary update sequence element #0 to a sequence'],
276+
)
277+
278+
def badgen():
279+
yield "key"
280+
raise TypeError("oops")
281+
yield "value"
282+
283+
with self.assertRaises(TypeError) as cm:
284+
dict([badgen() for _ in range(3)])
285+
286+
self.assertEqual(str(cm.exception), "oops")
287+
self.assertEqual(
288+
cm.exception.__notes__,
289+
['Cannot convert dictionary update sequence element #0 to a sequence'],
290+
)
291+
292+
268293
def test_fromkeys(self):
269294
self.assertEqual(dict.fromkeys('abc'), {'a':None, 'b':None, 'c':None})
270295
d = {}

Objects/dictobject.c

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

35173517
/* Convert item to sequence, and verify length 2. */
3518-
fast = PySequence_Fast(item, "");
3518+
fast = PySequence_Fast(item, "object is not iterable");
35193519
if (fast == NULL) {
3520-
if (PyErr_ExceptionMatches(PyExc_TypeError))
3521-
PyErr_Format(PyExc_TypeError,
3522-
"cannot convert dictionary update "
3520+
if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3521+
_PyErr_FormatNote(
3522+
"Cannot convert dictionary update "
35233523
"sequence element #%zd to a sequence",
35243524
i);
3525+
}
35253526
goto Fail;
35263527
}
35273528
n = PySequence_Fast_GET_SIZE(fast);

0 commit comments

Comments
 (0)