gh-116436: Improve error message when TypeError occurs during dict update (#116443)

This commit is contained in:
Shantanu 2025-04-29 22:18:06 -07:00 committed by GitHub
parent 4e294f6feb
commit 7e8b153fef
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 31 additions and 4 deletions

View file

@ -266,6 +266,31 @@ class DictTest(unittest.TestCase):
self.assertRaises(ValueError, {}.update, [(1, 2, 3)])
def test_update_type_error(self):
with self.assertRaises(TypeError) as cm:
{}.update([object() for _ in range(3)])
self.assertEqual(str(cm.exception), "object is not iterable")
self.assertEqual(
cm.exception.__notes__,
['Cannot convert dictionary update sequence element #0 to a sequence'],
)
def badgen():
yield "key"
raise TypeError("oops")
yield "value"
with self.assertRaises(TypeError) as cm:
dict([badgen() for _ in range(3)])
self.assertEqual(str(cm.exception), "oops")
self.assertEqual(
cm.exception.__notes__,
['Cannot convert dictionary update sequence element #0 to a sequence'],
)
def test_fromkeys(self):
self.assertEqual(dict.fromkeys('abc'), {'a':None, 'b':None, 'c':None})
d = {}

View file

@ -0,0 +1 @@
Improve error message when :exc:`TypeError` occurs during :meth:`dict.update`

View file

@ -3730,13 +3730,14 @@ merge_from_seq2_lock_held(PyObject *d, PyObject *seq2, int override)
}
/* Convert item to sequence, and verify length 2. */
fast = PySequence_Fast(item, "");
fast = PySequence_Fast(item, "object is not iterable");
if (fast == NULL) {
if (PyErr_ExceptionMatches(PyExc_TypeError))
PyErr_Format(PyExc_TypeError,
"cannot convert dictionary update "
if (PyErr_ExceptionMatches(PyExc_TypeError)) {
_PyErr_FormatNote(
"Cannot convert dictionary update "
"sequence element #%zd to a sequence",
i);
}
goto Fail;
}
n = PySequence_Fast_GET_SIZE(fast);