这是以下问题:
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)
my_other_module.py
def foo(**kwargs):
for k, v in kwargs.items():
print k, v
当我运行main_module.py
时,我希望按照我指定的顺序获得打印输出:
a 1
b 2
c 3
d 4
但我得到了:
a 1
c 3
b 2
d 4
我确实理解这与**
运算符的实现方式有关,并且它以某种方式无序传递字典对的传递方式。另外我也明白python中的字典不按列表排序,因为它们被实现为哈希表。有什么样的' hack'我可以应用,所以我得到了在这种情况下需要的行为?
P.S。 - 在我的情况下,我无法对foo函数中的字典进行排序,因为除了传递值的严格顺序之外,没有可遵循的规则。
答案 0 :(得分:9)
通过使用**a
,您将将有序词典解压缩到参数字典中。
因此,当您输入foo
时,kwargs
只是一个简单的字典,订单无法保证(除非您使用的是Python 3.6+,但这仍然是3.6中的实现细节,但是订购在3.7:Are dictionaries ordered in 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)