mirror of
https://github.com/python/cpython.git
synced 2025-08-31 05:58:33 +00:00
gh-116436: Improve error message when TypeError occurs during dict update (#116443)
This commit is contained in:
parent
4e294f6feb
commit
7e8b153fef
3 changed files with 31 additions and 4 deletions
|
@ -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 = {}
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Improve error message when :exc:`TypeError` occurs during :meth:`dict.update`
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue