From 7e8b153fef71e464246827bf563923e2991290c6 Mon Sep 17 00:00:00 2001 From: Shantanu <12621235+hauntsaninja@users.noreply.github.com> Date: Tue, 29 Apr 2025 22:18:06 -0700 Subject: gh-116436: Improve error message when TypeError occurs during dict update (#116443) --- Lib/test/test_dict.py | 25 ++++++++++++++++++++++ .../2024-03-06-22-33-33.gh-issue-116436.y8Thkt.rst | 1 + Objects/dictobject.c | 9 ++++---- 3 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2024-03-06-22-33-33.gh-issue-116436.y8Thkt.rst diff --git a/Lib/test/test_dict.py b/Lib/test/test_dict.py index 9485ef2..3104cbc 100644 --- a/Lib/test/test_dict.py +++ b/Lib/test/test_dict.py @@ -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 = {} diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2024-03-06-22-33-33.gh-issue-116436.y8Thkt.rst b/Misc/NEWS.d/next/Core_and_Builtins/2024-03-06-22-33-33.gh-issue-116436.y8Thkt.rst new file mode 100644 index 0000000..f9c3ab1 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2024-03-06-22-33-33.gh-issue-116436.y8Thkt.rst @@ -0,0 +1 @@ +Improve error message when :exc:`TypeError` occurs during :meth:`dict.update` diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 4fdfd63..b6f623b 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -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); -- cgit v0.12