Stefan Behnel <stefan...@behnel.de> added the comment:

At least for lxml, attributes were never specified to have a sorted order 
(although attribute dicts are sorted on *input*, to give a *predictable* order 
as in ET), and the tutorial says: "Attributes are just unordered name-value 
pairs".

However, I still think that Serhiy is right: this change would break code, and 
in particular test code that compares XML output. Having to deal with two 
different "correct" serialisations in tests depending on the Python version is 
annoying at best. But OTOH, comparing XML output should always be based on C14N 
and not on an arbitrary serialisation. XML C14N serialisation was specifically 
designed to provide a deterministic output byte sequence, regardless of how the 
XML document was created. (This is also used for cryptographic fingerprinting.)

It is interesting that ET sorts the attributes on output. lxml does it only on 
API *input*, because the underlying tree model is order preserving. Parsed 
attributes are always written in the original document order, followed by the 
attributes set through the API in the order in which they were set.

For lxml, a serialisation flag is not going to help, because the serialisation 
order is always deterministic from the time where an attribute is added to the 
tree. Given that dicts are order preserving in Python now, ET could follow this 
path as well. The attributes are already in parse order and could easily be 
serialised that way, and attributes that were added through the API would end 
up being serialised last, also preserving the order. This would leave lxml and 
ET with the same serialisation order, which seems attractive.

In short, I like this change, it's just difficult to see a way how this could 
preserve full backwards compatibility. And it's difficult to say how important 
backwards compatibility really is here.

----------

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue34160>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to