<p dir="ltr"><br>
On 6 Apr 2014 05:12, "Eric Snow" <<a href="mailto:ericsnowcurrently@gmail.com">ericsnowcurrently@gmail.com</a>> wrote:<br>
><br>
> On Apr 4, 2014 10:04 AM, "David Mertz" <<a href="mailto:mertz@gnosis.cx">mertz@gnosis.cx</a>> wrote:<br>
> > I confess that after reading this thread, and a number of related past ones, I'm still not certain exactly what problem all of this is needed to solve.<br>
><br>
> Yeah, it won't be worth it without justification.  :)  I'll spell it out in the PEP, but basically it boils down to these reasons:<br>
><br>
> * Helpful in debugging (from Raymond and others).<br>
> * Controlling object presentation.<br>
> * Anywhere you want to set iteration order and name/value in a single call (from Nick).<br>
>   + Factories for ordered types.<br>
>   + Serializable objects where order matters.</p>
<p dir="ltr">In the context of serialisation, one key lesson we have learned is that arbitrary ordering is a problem when you want to minimise spurious diffs, and sorting isn't a simple solution.</p>
<p dir="ltr">Tools like doctest don't tolerate spurious diffs at all, but are often amenable to a sorting based answer.</p>
<p dir="ltr">The cases where it would be highly desirable to be able use keyword arguments to control the order of display of a collection of key value pairs are ones like:</p>
<p dir="ltr">* printing out key:value pairs in CLI output<br>
* mapping semantic names to column order in a CSV<br>
* serialising attributes and elements in particular orders in XML<br>
* serialising map keys in particular orders in human readable formats like JSON and YAML (particularly when they're going to be placed under source control)</p>
<p dir="ltr">These *can* all be done today, but *not* by using keyword arguments. In my view, the problem to be addressed is that keyword arguments *look* like they should work for these cases, because they have a definite order in the source code. The only reason they don't work is because the interpreter throws that ordering information away.</p>

<p dir="ltr">It's a textbook case of a language feature becoming an attractive nuisance in some circumstances: the simple and obvious solution for the above use cases *doesn't actually work* for reasons that aren't obviously clear if you don't have a firm grasp of Python's admittedly complicated argument handling.</p>

<p dir="ltr">The simplest way out that I can see? Just make it work, even if that means also preserving the order of arbitrary keyword arguments in cases that *dont* need it.</p>
<p dir="ltr">Deciding whether or not to provide a way to opt in to dropping the order info for speed and memory reasons then becomes a separate optimisation discussion *after* the current usability trap has been addressed.</p>

<p dir="ltr">Cheers,<br>
Nick.</p>
<p dir="ltr">> * Keyword argument priority.<br>
><br>
> I have a few more less concrete use cases as well.  OrderedDict is the first example everyone cites, but it's simply the most obvious.  Furthermore, it's a rather self-referential example. :)  As I said, I'll make the full case in the PEP, which I hope to get out today.<br>

><br>
> > ISTM that if one has a special function calling requirement to pass in an ordered collection of key/value pairs, one can already just use a special and available call signature for your function:<br>
> ><br>
> >   def myfunc(a, b, *keyvals):<br>
> >       od = OrderedDict(keyvals)<br>
> >       # ... do other stuff<br>
> ><br>
> > Call this like:<br>
> ><br>
> >   value = myfunc(foo, bar, ('a',1), ('z',2), ('b',3))<br>
> ><br>
> > Yes, it's a slightly special form of the calling convention, but it does something slightly special with its key/val-like arguments, so that seems like a reasonable tradeoff.  The solution is purely local to the writer of the function who needs this.<br>

><br>
> That's clever.  However, it is basically the same as the status quo: if you want to preserve order you cannot use keyword arguments, including ** unpacking, even though they are the natural way to do it.  For existing functions, preserving order means changing code even though the order is already available.  The point of my proposal is to teach the interpreter to preserve the order.<br>

><br>
> -eric<br>
><br>
><br>
> _______________________________________________<br>
> Python-ideas mailing list<br>
> <a href="mailto:Python-ideas@python.org">Python-ideas@python.org</a><br>
> <a href="https://mail.python.org/mailman/listinfo/python-ideas">https://mail.python.org/mailman/listinfo/python-ideas</a><br>
> Code of Conduct: <a href="http://python.org/psf/codeofconduct/">http://python.org/psf/codeofconduct/</a><br>
</p>