https://github.com/python/cpython/commit/90b6d0e0f8f07d7443695e14a18488cb499d3b4d
commit: 90b6d0e0f8f07d7443695e14a18488cb499d3b4d
branch: main
author: Bar Harel <[email protected]>
committer: serhiy-storchaka <[email protected]>
date: 2024-08-23T12:12:58+03:00
summary:
gh-123213: Fixed xml.etree.ElementTree.Element.extend and assignment to no
longer hide exceptions (GH-123214)
files:
A Misc/NEWS.d/next/Library/2024-08-22-09-37-48.gh-issue-123213.owmXnP.rst
M Doc/library/xml.etree.elementtree.rst
M Lib/test/test_xml_etree.py
M Modules/_elementtree.c
diff --git a/Doc/library/xml.etree.elementtree.rst
b/Doc/library/xml.etree.elementtree.rst
index 51bf88313e5b7a..9fad463d936660 100644
--- a/Doc/library/xml.etree.elementtree.rst
+++ b/Doc/library/xml.etree.elementtree.rst
@@ -971,7 +971,7 @@ Element Objects
.. method:: extend(subelements)
- Appends *subelements* from a sequence object with zero or more elements.
+ Appends *subelements* from an iterable of elements.
Raises :exc:`TypeError` if a subelement is not an :class:`Element`.
.. versionadded:: 3.2
diff --git a/Lib/test/test_xml_etree.py b/Lib/test/test_xml_etree.py
index 930501633d1f38..ae06a9cc11855f 100644
--- a/Lib/test/test_xml_etree.py
+++ b/Lib/test/test_xml_etree.py
@@ -2423,6 +2423,22 @@ def test_39495_treebuilder_start(self):
self.assertRaises(TypeError, ET.TreeBuilder().start, "tag")
self.assertRaises(TypeError, ET.TreeBuilder().start, "tag", None)
+ def test_issue123213_correct_extend_exception(self):
+ # Does not hide the internal exception when extending the element
+ self.assertRaises(ZeroDivisionError, ET.Element('tag').extend,
+ (1/0 for i in range(2)))
+
+ # Still raises the TypeError when extending with a non-iterable
+ self.assertRaises(TypeError, ET.Element('tag').extend, None)
+
+ # Preserves the TypeError message when extending with a generator
+ def f():
+ raise TypeError("mymessage")
+
+ self.assertRaisesRegex(
+ TypeError, 'mymessage',
+ ET.Element('tag').extend, (f() for i in range(2)))
+
# --------------------------------------------------------------------
@@ -3748,6 +3764,22 @@ def test_setslice_negative_steps(self):
e[1::-sys.maxsize<<64] = [ET.Element('d')]
self.assertEqual(self._subelem_tags(e), ['a0', 'd', 'a2', 'a3'])
+ def test_issue123213_setslice_exception(self):
+ e = ET.Element('tag')
+ # Does not hide the internal exception when assigning to the element
+ with self.assertRaises(ZeroDivisionError):
+ e[:1] = (1/0 for i in range(2))
+
+ # Still raises the TypeError when assigning with a non-iterable
+ with self.assertRaises(TypeError):
+ e[:1] = None
+
+ # Preserve the original TypeError message when assigning.
+ def f():
+ raise TypeError("mymessage")
+
+ with self.assertRaisesRegex(TypeError, 'mymessage'):
+ e[:1] = (f() for i in range(2))
class IOTest(unittest.TestCase):
def test_encoding(self):
diff --git
a/Misc/NEWS.d/next/Library/2024-08-22-09-37-48.gh-issue-123213.owmXnP.rst
b/Misc/NEWS.d/next/Library/2024-08-22-09-37-48.gh-issue-123213.owmXnP.rst
new file mode 100644
index 00000000000000..6bbd194b916ec4
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2024-08-22-09-37-48.gh-issue-123213.owmXnP.rst
@@ -0,0 +1,3 @@
+:meth:`xml.etree.ElementTree.Element.extend` and
+:class:`~xml.etree.ElementTree.Element` assignment no longer hide the internal
+exception if an erronous generator is passed. Patch by Bar Harel.
diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c
index 3818e20b4f0f28..ec999582d2fb9d 100644
--- a/Modules/_elementtree.c
+++ b/Modules/_elementtree.c
@@ -1213,12 +1213,8 @@ _elementtree_Element_extend_impl(ElementObject *self,
PyTypeObject *cls,
PyObject* seq;
Py_ssize_t i;
- seq = PySequence_Fast(elements, "");
+ seq = PySequence_Fast(elements, "'elements' must be an iterable");
if (!seq) {
- PyErr_Format(
- PyExc_TypeError,
- "expected sequence, not \"%.200s\"", Py_TYPE(elements)->tp_name
- );
return NULL;
}
@@ -1918,12 +1914,8 @@ element_ass_subscr(PyObject* self_, PyObject* item,
PyObject* value)
}
/* A new slice is actually being assigned */
- seq = PySequence_Fast(value, "");
+ seq = PySequence_Fast(value, "assignment expects an iterable");
if (!seq) {
- PyErr_Format(
- PyExc_TypeError,
- "expected sequence, not \"%.200s\"", Py_TYPE(value)->tp_name
- );
return -1;
}
newlen = PySequence_Fast_GET_SIZE(seq);
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]