In Python, what determines the order while iterating through kwargs?

前端 未结 6 1285
悲&欢浪女
悲&欢浪女 2020-12-03 17:45

In python, I wrote this function to teach myself how **kwargs works in Python:

def fxn(a1, **kwargs):
    print a1
    for k in kwargs:
                 


        
相关标签:
6条回答
  • 2020-12-03 18:04

    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.

    0 讨论(0)
  • 2020-12-03 18:04

    kwargs is a dictionary, in Python these are not ordered so the result is essentially (pseudo-) random.

    0 讨论(0)
  • 2020-12-03 18:08

    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. :(

    0 讨论(0)
  • 2020-12-03 18:09

    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).

    0 讨论(0)
  • 2020-12-03 18:24

    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))))
      
    0 讨论(0)
  • 2020-12-03 18:29

    This has finally been introduced in the 3.6 release: dicts 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'])
    
    0 讨论(0)
提交回复
热议问题