In python, I wrote this function to teach myself how **kwargs
works in Python:
def fxn(a1, **kwargs):
print a1
for k in kwargs:
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.
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):
od = OrderedDict(a=1, b=2, c=3)
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. :(
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):
It is best to think of a dictionary as an unordered set of key: value pairs, with the requirement that the keys are unique (within one dictionary).
But you can make it processed in some order, like that:
using sorted()
:
def fxn(a1, **kwargs):
print a1
for k in sorted(kwargs): # notice "kwargs" replaced by "sorted(kwargs)"
print k, " : ", kwargs[k]
or by using OrderedDict
type (you can pass OrderedDict
object as parameter containing all the key-value pairs):
from collections import OrderedDict
def fxn(a1, ordkwargs):
print a1
for k in ordkwargs:
print k, " : ", ordkwargs[k]
fxn(3, OrderedDict((('a2',2), ('a3',3), ('a4',4))))
This has finally been introduced in the 3.6 release: dict
s are now ordered, therefore the keyword argument order is preserved.
Python 3.6.0 (default, Jan 13 2017, 13:27:48)
>>> def print_args(**kwargs):
... print(kwargs.keys())
...
>>> print_args(first=1, second=2, third=3)
dict_keys(['first', 'second', 'third'])