“类似ES6”的Python字典传播

Hue*_*cio 1 python

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

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

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

a, b, c = spread(d) # how?
Run Code Online (Sandbox Code Playgroud)

或者spread(d, ???)。我考虑初始化a, b, cNone然后将它们作为列表传递。

关于如何解决这个问题有什么想法或线索吗?可能吗?谢谢!

Sam*_*son 8

不太漂亮,但你可以这样做:

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

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

f1(**d)
Run Code Online (Sandbox Code Playgroud)

非常不同的语义,但发布是希望它能激发一些东西!

根据@phhu的评论,**在定义中f1是一个包罗万象的关键字参数说明符,告诉Python所有不匹配的参数都应该放入给定名称的字典中,_在我的例子中。调用 asf1(**d)表示将指定的字典解包到函数的参数中。

因此,如果它的用法如下:

e = {"a": 1, "b": 2, "c": 3, "extra": 42}

f1(**e)
Run Code Online (Sandbox Code Playgroud)

那么内部f1变量_将被设置为{"extra": 42}。我使用这个标识符是因为在几种语言_中使用这个标识符来指示一次性/占位符变量名,即以后不会使用的东西。


Pat*_*ugh 5

不,这不是真的可能。你不能有

a, b, c = spread(d)
Run Code Online (Sandbox Code Playgroud)

a, c, b = spread(d)
Run Code Online (Sandbox Code Playgroud)

赋予相同的价值b。这是因为赋值语句的右侧首先被评估。因此spread,在代码知道将它们放在左侧的顺序之前,执行并返回其值。

一些使用Google搜索的人会相信,通过“字典的类似散布的语法”,您正在寻找**dict语法。请参阅**(双星号/星号)和*(星号/星号)对参数有何作用?