In python, I wrote this function to teach myself how **kwargs
works in Python:
def fxn(a1, **kwargs):
print a1
for k in kwargs:
print k, " : ", kwargs[k]
I then called this function with
fxn(3, a2=2, a3=3, a4=4)
Here was the output that my Python interpreter printed:
3
a3 : 3
a2 : 2
a4 : 4
Why did the for loop print the value of a3 before that of a2 even though I fed a2 into my function first?
The unfortunate irony is that the dict-ification of **kwargs means that the following will not work (at least not the way one would expect):
Since the keyworded args are first built into an unordered dict, you cannot depend that they will be inserted into the OrderedDict in the order they are listed. :(
This has finally been introduced in the 3.6 release:
dict
s are now ordered, therefore the keyword argument order is preserved.kwargs
is a dictionary. Dictionaries are unordered - simply put, the order is unspecified and an implementation detail. Peeking under the hood will show that the order varies wildly depending on the hash values of the items, the order of insertion, etc. so you better don't rely on anything related to it.kwargs
is a dictionary, in Python these are not ordered so the result is essentially (pseudo-) random.Since
kwargs
is a Python dictionary, which is implemented as a hash table, its ordering is not preserved and is effectively random.Actually, as a fix to a recent security issue in many programming languages, in the future the order may even change between invocations of your program (invocations of the Python interpreter).
This is a dictionary. And, as mentioned in documentation, dictionary has no order (from http://docs.python.org/tutorial/datastructures.html#dictionaries):
But you can make it processed in some order, like that:
using
sorted()
:or by using
OrderedDict
type (you can passOrderedDict
object as parameter containing all the key-value pairs):