如何解压缩字典以便它被传递?

Sir*_*Lot 2 python dictionary ordereddictionary

这是以下问题:

main_module.py

from collections import OrderedDict
from my_other_module import foo

a = OrderedDict([
    ('a', 1),
    ('b', 2),
    ('c', 3),
    ('d', 4),
    ])

foo(**a)
Run Code Online (Sandbox Code Playgroud)

my_other_module.py

def foo(**kwargs):
    for k, v in kwargs.items():
        print k, v
Run Code Online (Sandbox Code Playgroud)

当我运行时,main_module.py我希望按照我指定的顺序打印输出:

a 1
b 2
c 3
d 4
Run Code Online (Sandbox Code Playgroud)

但相反,我得到:

a 1
c 3
b 2
d 4
Run Code Online (Sandbox Code Playgroud)

我确实理解这与**操作符的实现方式有关,并且它以某种方式丢失了字典对传入的顺序.我也明白python中的字典不是按列表排序的,因为它们是作为哈希表实现的.是否有任何类型的"黑客"我可以应用,所以我得到了在这种情况下所需的行为?

PS - 在我的情况下,我无法对foo函数内的字典进行排序,因为除了传递值的严格顺序之外,没有可遵循的规则.

Jea*_*bre 9

通过使用**a您将有序字典解压缩到参数字典中.

因此,当你输入时foo,kwargs只是一个简单的字典,订单无法保证(除非你使用的是Python 3.6+,但这仍然是3.6中的实现细节,但顺序在3.7中成为官方:在Python 3.6+中排序字典?)

在这种情况下,您可能会失去打包/解包,因此对于旧版本的python来说它是可移植的.

from collections import OrderedDict

def foo(kwargs):
    for k, v in kwargs.items():
        print(k, v)

a = OrderedDict([
    ('a', 1),
    ('b', 2),
    ('c', 3),
    ('d', 4),
    ])

foo(a)
Run Code Online (Sandbox Code Playgroud)