You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
I can't quite sort this out, because it's difficult to see what is
intended. The documentation of xml.etree.ElementTree (19.11 in the
Library doc) uses terms like "iterator", "tree iterator", "iterable",
"list" in vague and perhaps not quite accurate ways. I can't tell from
the documentation which functions/methods return lists, which return a
generator, which return an unspecified kind of iterable, and so on.
Moreover, the results are different using ElementTree than they are
using cElementTree. In particular, getiterator() returns a list in
ElementTree and a generator in cElementTree. This can make a substantial
difference in performance when iterating over a large number of nodes
(in addition to cElementTree's parsing being what appears to be about
10x faster).
I think someone should go over the page and sort this out and make it
clear what the user can expect. (I don't think it's fair to
overgeneralize to things like "iterables" if the module is really meant
to be making a commitment to a list or a generator.) I also think that
the differences in the results of methods returned in the Python and C
versions of the module should be highlighted.
I stumbled on this trying to parses and extract individual bits of
information out of large XML files. I full well realize there are better
ways to do this (SAX, e.g.) and better ways to search than just iterate
over all the tags of the type I'm interested in, but I should still know
what to expect from ElementTree, especially because it is so wonderful!
This isn't just a documentation issue. A function named getiterator(),
for which the docs say that it returns an iterator, should return an
iterator, not just an iterable. They have different semantics and can't
be used interchangeably, so the behaviour of getiterator() in
ElementTree is wrong. I was using this in my program:
Which broke when I tried switching to ElementTree from cElementTree,
even though the docs tell me that I'll get an iterator there.
Also, for findall() and friends, is there any reason why we can't stick
to either an iterator or list, and not both? The API will be more clear
if findall() always returned a list, or always an iterator, regardless
of the implementation. It is currently not clear what will happen if I do:
There's many differences between both implementations.
I don't know if we can live with them or not.
~ $ ./python
Python 3.1.1+ (release31-maint:76650, Dec 3 2009, 17:14:50)
[GCC 4.3.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from xml.etree import ElementTree asET, cElementTree as cET
>>> from io import StringIO
>>> SAMPLE='<root/>'
>>> IO_SAMPLE= StringIO(SAMPLE)
With ElementTree
>>> elt =ET.XML(SAMPLE)
>>> elt.getiterator()
[<Element root at 15cb920>]
>>> elt.findall('') # or '.'
[<Element root at 15cb920>]
>>> elt.findall('./')
[<Element root at 15cb920>]
>>> elt.items()
dict_items([])
>>> elt.keys()
dict_keys([])
>>> elt[:]
[]
>>> IO_SAMPLE.seek(0)
>>> next(ET.iterparse(IO_SAMPLE))
('end', <Element root at 15d60d0>)
>>> IO_SAMPLE.seek(0)
>>> list(ET.iterparse(IO_SAMPLE))
[('end', <Element root at 15583e0>)]
With cElementTree
>>> elt_c = cET.XML(SAMPLE)
>>> elt_c.getiterator()
<generator object getiterator at 0x15baae0>
>>> elt_c.findall('')
[]
>>> elt_c.findall('./')
[<Element 'root' at 0x15cf3a0>]
>>> elt_c.items()
[]
>>> elt_c.keys()
[]
>>> elt_c[:]
Traceback (most recent call last):
TypeError: sequence index must be integer, not 'slice'
>>> IO_SAMPLE.seek(0)
>>> next(cET.iterparse(IO_SAMPLE))
Traceback (most recent call last):
TypeError: iterparse object is not an iterator
>>> IO_SAMPLE.seek(0)
>>> list(cET.iterparse(IO_SAMPLE))
[(b'end', <Element 'root' at 0x15cf940>)]
florentx commented on Dec 6, 2009
florentxmannequin
Mannequin
More actions
Proposed patch fixes most of the discrepancies between both implementations.
It restores some features that were lost with Python 3:
cElement slicing and extended slicing
iterparse, cET.getiterator and cET.findall return an iterator
(as documented)
Some tests were added to check these issues.
florentx commented on Dec 6, 2009
florentxmannequin
Mannequin
More actions
I fixed it differently, using the upstream modules (Thank you Fredrik).
changed the title [-]Inconsistent use of "iterator" in ElementTree doc & diff between Py and C modules[/-][+]Update ElementTree with upstream changes[/+]on Feb 10, 2010
florentx commented on Feb 16, 2010
florentxmannequin
Mannequin
More actions
Update the 2.x patch with the last version uploaded to rietveld (patch set 5).
Improved test coverage with upstream tests and tests cases provided by Neil on issue bpo-6232.
Note: the patch for 3.x is obsolete.
florentx commented on Feb 17, 2010
florentxmannequin
Mannequin
More actions
Strip out the experimental C API.
florentx commented on Mar 11, 2010
florentxmannequin
Mannequin
More actions
Fixed on trunk with r78838.
Some extra work is required to port it to 3.x.
Thank you Fredrik and Antoine for reviewing this patch.
effbot commented on Mar 11, 2010
effbotmannequin
Mannequin
More actions
W00t!
florentx commented on Mar 12, 2010
florentxmannequin
Mannequin
More actions
Patch to merge ElementTree 1.3 in 3.x.
florentx commented on Mar 14, 2010
florentxmannequin
Mannequin
More actions
Merged in 3.x with r78942 and r78945.
See bpo-8047 for a discussion about the encoding argument of the serializer (used for .write() method and tostring() tostringlist() functions).
Currently the output is not encoded by default in 3.1 and 3.x.
It is encoded to ASCII in 2.6 and 2.x.
Activity
MLModel commentedon Jul 13, 2009
I can't quite sort this out, because it's difficult to see what is
intended. The documentation of xml.etree.ElementTree (19.11 in the
Library doc) uses terms like "iterator", "tree iterator", "iterable",
"list" in vague and perhaps not quite accurate ways. I can't tell from
the documentation which functions/methods return lists, which return a
generator, which return an unspecified kind of iterable, and so on.
Moreover, the results are different using ElementTree than they are
using cElementTree. In particular, getiterator() returns a list in
ElementTree and a generator in cElementTree. This can make a substantial
difference in performance when iterating over a large number of nodes
(in addition to cElementTree's parsing being what appears to be about
10x faster).
I think someone should go over the page and sort this out and make it
clear what the user can expect. (I don't think it's fair to
overgeneralize to things like "iterables" if the module is really meant
to be making a commitment to a list or a generator.) I also think that
the differences in the results of methods returned in the Python and C
versions of the module should be highlighted.
I stumbled on this trying to parses and extract individual bits of
information out of large XML files. I full well realize there are better
ways to do this (SAX, e.g.) and better ways to search than just iterate
over all the tags of the type I'm interested in, but I should still know
what to expect from ElementTree, especially because it is so wonderful!
milkokrachounov commentedon Dec 5, 2009
This isn't just a documentation issue. A function named getiterator(),
for which the docs say that it returns an iterator, should return an
iterator, not just an iterable. They have different semantics and can't
be used interchangeably, so the behaviour of getiterator() in
ElementTree is wrong. I was using this in my program:
Which broke when I tried switching to ElementTree from cElementTree,
even though the docs tell me that I'll get an iterator there.
Also, for findall() and friends, is there any reason why we can't stick
to either an iterator or list, and not both? The API will be more clear
if findall() always returned a list, or always an iterator, regardless
of the implementation. It is currently not clear what will happen if I do:
florentx commentedon Dec 5, 2009
There's many differences between both implementations.
I don't know if we can live with them or not.
With ElementTree
With cElementTree
florentx commentedon Dec 6, 2009
Proposed patch fixes most of the discrepancies between both implementations.
It restores some features that were lost with Python 3:
(as documented)
Some tests were added to check these issues.
florentx commentedon Dec 6, 2009
I fixed it differently, using the upstream modules (Thank you Fredrik).
It works.
And it closes bpo-1143, too.
pitrou commentedon Dec 7, 2009
The patch should have doc updates for new functionality, if any.
florentx commentedon Dec 7, 2009
I see some new features in the changelog.
I will try to update the documentation during the week.
(patch "py3k" fixed: support assignment of arbitrary sequences)
florentx commentedon Dec 9, 2009
Patch for the documentation. (source: upstream documentation)
florentx commentedon Dec 14, 2009
Small update of the patch for 3.2: the __cmp__method is replaced with
__eq__ method (on CommentProxy and PIProxy).
florentx commentedon Jan 11, 2010
It would be nice to upgrade ElementTree for 2.7 and 3.2, at least.
florentx commentedon Feb 9, 2010
Patch updated, with upstream packages:
Now all tests are identical for the ElementTree part:
Waiting for some developer kind enough to review and merge in 2.7 and 3.2.
pitrou commentedon Feb 9, 2010
Given the size of the patch, it's very difficult to review properly.
In any case, could you upload it to http://codereview.appspot.com/ ?
florentx commentedon Feb 9, 2010
Ok, will do the upload to rietveld.
In addition to the straight review of the patch itself, you could:
Btw, I've backported the last tests (bpo-2746, bpo-6233) to all 4 test files (ET and cET, 2.x and 3.x).
florentx commentedon Feb 9, 2010
Here it is:
[-]Inconsistent use of "iterator" in ElementTree doc & diff between Py and C modules[/-][+]Update ElementTree with upstream changes[/+]florentx commentedon Feb 16, 2010
Update the 2.x patch with the last version uploaded to rietveld (patch set 5).
Improved test coverage with upstream tests and tests cases provided by Neil on issue bpo-6232.
Note: the patch for 3.x is obsolete.
florentx commentedon Feb 17, 2010
Strip out the experimental C API.
florentx commentedon Mar 11, 2010
Fixed on trunk with r78838.
Some extra work is required to port it to 3.x.
Thank you Fredrik and Antoine for reviewing this patch.
effbot commentedon Mar 11, 2010
W00t!
florentx commentedon Mar 12, 2010
Patch to merge ElementTree 1.3 in 3.x.
florentx commentedon Mar 14, 2010
Merged in 3.x with r78942 and r78945.
See bpo-8047 for a discussion about the
encodingargument of the serializer (used for .write() method and tostring() tostringlist() functions).Currently the output is not encoded by default in 3.1 and 3.x.
It is encoded to ASCII in 2.6 and 2.x.