https://github.com/python/cpython/commit/7e8b153fef71e464246827bf563923e2991290c6
commit: 7e8b153fef71e464246827bf563923e2991290c6
branch: main
author: Shantanu <12621235+hauntsani...@users.noreply.github.com>
committer: hauntsaninja <12621235+hauntsani...@users.noreply.github.com>
date: 2025-04-29T22:18:06-07:00
summary:

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

files:
A 
Misc/NEWS.d/next/Core_and_Builtins/2024-03-06-22-33-33.gh-issue-116436.y8Thkt.rst
M Lib/test/test_dict.py
M Objects/dictobject.c

diff --git a/Lib/test/test_dict.py b/Lib/test/test_dict.py
index 9485ef2889f760..3104cbc66cb115 100644
--- a/Lib/test/test_dict.py
+++ b/Lib/test/test_dict.py
@@ -266,6 +266,31 @@ def __next__(self):
 
         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 00000000000000..f9c3ab1f0a5ab8
--- /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 4fdfd63cd4f714..b6f623b8ce9df6 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);

_______________________________________________
Python-checkins mailing list -- python-checkins@python.org
To unsubscribe send an email to python-checkins-le...@python.org
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: arch...@mail-archive.com

Reply via email to