]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-116436: Improve error message when TypeError occurs during dict update (#116443)
authorShantanu <12621235+hauntsaninja@users.noreply.github.com>
Wed, 30 Apr 2025 05:18:06 +0000 (22:18 -0700)
committerGitHub <noreply@github.com>
Wed, 30 Apr 2025 05:18:06 +0000 (22:18 -0700)
Lib/test/test_dict.py
Misc/NEWS.d/next/Core_and_Builtins/2024-03-06-22-33-33.gh-issue-116436.y8Thkt.rst [new file with mode: 0644]
Objects/dictobject.c

index 9485ef2889f7600dd13c85f457e353e86a48710d..3104cbc66cb1150b8b97ecf7ac4ee98cbcecd31c 100644 (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 = {}
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 (file)
index 0000000..f9c3ab1
--- /dev/null
@@ -0,0 +1 @@
+Improve error message when :exc:`TypeError` occurs during :meth:`dict.update`
index 4fdfd63cd4f7148fef92b5eb053e199149e0cd8a..b6f623b8ce9df6578d6378805c322ee4de4d6839 100644 (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);