[Python-checkins] bpo-41892: Clarify that an example in the ElementTree docs explicitly avoids modifying an XML tree while iterating over it. (GH-22464)

scoder webhook-mailer at python.org
Sun Oct 4 19:13:53 EDT 2020


https://github.com/python/cpython/commit/40db798692ca783fc2163656f196ac77e8b9e792
commit: 40db798692ca783fc2163656f196ac77e8b9e792
branch: master
author: scoder <stefan_ml at behnel.de>
committer: GitHub <noreply at github.com>
date: 2020-10-04T19:13:46-04:00
summary:

bpo-41892: Clarify that an example in the ElementTree docs explicitly avoids modifying an XML tree while iterating over it. (GH-22464)

files:
M Doc/library/xml.etree.elementtree.rst

diff --git a/Doc/library/xml.etree.elementtree.rst b/Doc/library/xml.etree.elementtree.rst
index 7725e4d158d42..f4bccf6609810 100644
--- a/Doc/library/xml.etree.elementtree.rst
+++ b/Doc/library/xml.etree.elementtree.rst
@@ -251,12 +251,18 @@ We can remove elements using :meth:`Element.remove`.  Let's say we want to
 remove all countries with a rank higher than 50::
 
    >>> for country in root.findall('country'):
+   ...     # using root.findall() to avoid removal during traversal
    ...     rank = int(country.find('rank').text)
    ...     if rank > 50:
    ...         root.remove(country)
    ...
    >>> tree.write('output.xml')
 
+Note that concurrent modification while iterating can lead to problems,
+just like when iterating and modifying Python lists or dicts.
+Therefore, the example first collects all matching elements with
+``root.findall()``, and only then iterates over the list of matches.
+
 Our XML now looks like this:
 
 .. code-block:: xml



More information about the Python-checkins mailing list