From: Barry Warsaw <barry@python.org> Sent: Thursday, April 10, 2014 3:04 PM
Wouldn't another, much less invasive, much more explicit approach be to not squash subclasses of dict when passed into **args?
IOW, the way to preserve order would be:
def foo(**kws): ... print(kws) ... from collections import OrderedDict as od foo(**od(a=1, b=2, c=3)) OrderedDict([('a', 1), ('c', 3), ('b', 2)]) # instead of: {'a': 1, 'c': 3, 'b': 2}
I think your own example shows why this doesn't work. You wanted to pass in a=1, b=2, c=3 by passing it through an OrderedDict… but you ended up passing a=1, c=3, b=2 instead. So you've successfully preserved _an_ order in kws, but not the one you wanted. (Also, a **kws parameter doesn't get a squashed copy of the **d argument in the first place; it gets a new dict, into which things get copied. And the things that get copied aren't the members of d unless both exist, and there are no members of d that match named parameters, and there are no keyword arguments that don't match named parameters. So, I don't think this suggestion is even a coherent solution, much less a successful one. But you could obviously fix that by saying that, e.g., you create a new type(d) instead of a new dict, and then add things to that normally.)