【问题标题】:How to unpack dictionary in order that it was passed?如何解压字典以使其通过?
【发布时间】:2018-11-11 08:43:52
【问题描述】:

这是以下问题:

ma​​in_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”,以便获得在这种情况下所需的行为?

附: - 在我的情况下,我无法在 foo 函数中对字典进行排序,因为除了传入值的严格顺序之外,没有可以遵循的规则。

【问题讨论】:

  • 为什么不直接将OrderedDict 作为普通参数而不是**kwarg 传递?

标签: python python-2.7 dictionary ordereddictionary


【解决方案1】:

通过使用**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)

【讨论】:

  • 好吧,当有人像这样拨打foo 时,我们想支持这种情况:foo(argument='value')。按照您的建议,我们必须严格将字典类型传递给foo。如果没有其他解决方案,我想这是唯一有效的解决方案。
  • foo(argument1='value', argument2='value2'),如果你映射到**kwargs,这是完全相同的订单问题。除非你在问题消失的地方强制执行 python 3.6+。
猜你喜欢
  • 1970-01-01
  • 2015-09-30
  • 1970-01-01
  • 2021-02-13
  • 1970-01-01
  • 2021-11-15
  • 2018-11-03
  • 2011-11-01
相关资源
最近更新 更多