“类似ES6”的Python字典传播

时间:2019-01-18 16:06:22

标签: python

我正在尝试在Python 3.6中编写函数spread(我不能使用任何较新的版本),到目前为止,我已经有了类似这样的东西:

d = {"a": 1, "b": 2, "c": 3}
a, b, c = spread(d, ['a', 'b', 'c'])
a
>> 1
b
>> 2
c
>> 3

问题是:存在某种重复,因为左侧的位置必须与函数第二个参数上的键列表匹配才能使其有意义。因此,更改键列表的顺序,变量a将与d['a']保持不同值。我要保持一致性

a, b, c = spread(d) # how?

spread(d, ???)。我考虑使用a, b, c初始化None,然后将它们作为列表传递。

关于如何处理此问题的任何想法或线索?可能吗 谢谢!

4 个答案:

答案 0 :(得分:4)

不,这实际上是不可能的。您不能拥有

a, b, c = spread(d)

a, c, b = spread(d)

将相同的值赋予b。这是因为the right side of an assignment statement is evaluated first。因此,spread将执行并返回其值,直到您的代码知道将它们放在左边的顺序。

一些谷歌搜索线索被认为是,通过“字典的类似散布的语法”,您正在寻找**dict语法。参见What does ** (double star/asterisk) and * (star/asterisk) do for parameters?

答案 1 :(得分:1)

globals().update(d)会执行您的要求,但是...

  • 它仅在全局范围内起作用,不能保证locals()返回可写字典。
  • 这会损害代码的可调试性。如果以此方式设置的变量之一最终以意外的值结尾,则没有搜索会向您显示这是设置变量的地方。

答案 2 :(得分:0)

您可以将变量分配给values()调用的结果:

>>> d = {"a": 1, "b": 2, "c": 3}
>>> a,b,c = d.values()
>>> a
1
>>> b
2
>>> c
3

我不建议在不保证dict排序的Python版本中执行此操作,但幸运的是,此操作应在3.6及更高版本中起作用。

答案 3 :(得分:0)

不是很漂亮,但是您可以在那做些事情:

def f1(a, b, c, **_):
    print(a)
    print(b)
    print(c)

d = {"a": 1, "b": 2, "c": 3}

f1(**d)

非常不同的语义,但希望它能激发灵感!