summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorscoder <stefan_ml@behnel.de>2020-10-04 23:13:46 (GMT)
committerGitHub <noreply@github.com>2020-10-04 23:13:46 (GMT)
commit40db798692ca783fc2163656f196ac77e8b9e792 (patch)
tree8131fbcafb9210edd4ccb8298fb6ae1385489a6a
parent9ece9cd65cdeb0a1f6e60475bbd0219161c348ac (diff)
downloadcpython-40db798692ca783fc2163656f196ac77e8b9e792.zip
cpython-40db798692ca783fc2163656f196ac77e8b9e792.tar.gz
cpython-40db798692ca783fc2163656f196ac77e8b9e792.tar.bz2
bpo-41892: Clarify that an example in the ElementTree docs explicitly avoids modifying an XML tree while iterating over it. (GH-22464)
-rw-r--r--Doc/library/xml.etree.elementtree.rst6
1 files changed, 6 insertions, 0 deletions
diff --git a/Doc/library/xml.etree.elementtree.rst b/Doc/library/xml.etree.elementtree.rst
index 7725e4d..f4bccf6 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