This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author scoder
Recipients eli.bendersky, rhettinger, scoder, serhiy.storchaka
Date 2018-07-20.07:56:42
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1532073402.4.0.56676864532.issue34160@psf.upfronthosting.co.za>
In-reply-to
Content
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.
History
Date User Action Args
2018-07-20 07:56:42scodersetrecipients: + scoder, rhettinger, eli.bendersky, serhiy.storchaka
2018-07-20 07:56:42scodersetmessageid: <1532073402.4.0.56676864532.issue34160@psf.upfronthosting.co.za>
2018-07-20 07:56:42scoderlinkissue34160 messages
2018-07-20 07:56:42scodercreate