“关键字形式的形式参数”的目的究竟是什么?我把它放在引文中,因为这就是它在文档中提到的内容,但是我很难找到它的信息,并认为可能有一个正式的术语。
据我了解,它允许用户执行类似
的操作def foo(**keywords):
for i in keywords:
print(i, ":", keywords[i])
foo(val1="1", val2="2", val3="3")
输出:
val1 : 1
val2 : 2
val3 : 3
这究竟有什么优势?为了便于理解,不会传递字典变量更好吗?
答案 0 :(得分:2)
如果您使用字典,则调用函数将如下所示:
myfunv({"key1": "value1", "key2": "value2"})
使用** kwargs这就变成了
myfunc(key1="value1", key2="value2")
许多人更喜欢后者。
当您将参数透明地传递给另一个函数或类时,此构造也非常有用。例如,在子类化Tkinter小部件时,我经常使用它。我想支持基类的所有选项,所以我这样编码:
class MyFrame(tk.Frame):
def __init__(self, *args, **kwargs):
tk.Frame.__init__(self, *args, **kwargs)
<more code here>
这允许我支持所有相同的参数,而不必明确地列出它们。
答案 1 :(得分:1)
一种用途是当您想要转发参数时。例如:
def do_some_work(kwd1=None, kwd2=None, ...):
....
def intermediate_function(some_other_params, **kwargs):
...
do_some_work(**kwargs)
def main():
intermediate_function(some_other_params, kwd1=5, kwd2='foo')
这样,如果您向do_some_work
添加参数,则不必将其添加到intermediate_function
的定义和其中do_some_work
的调用。< / p>
它使用的另一个地方是Django的信号处理程序。编写处理程序时,请以
形式编写def handle_signal(sender, instance, **kwargs):
这样可以更改API以便将来传递其他参数,而无需用户将参数添加到一堆不会使用它们的方法中。
答案 2 :(得分:0)
使用此构造,调用者可以使用标准关键字参数。
答案 3 :(得分:0)
历史参数传递可以通过位置或通过关键字参数进行。将复杂对象作为参数传递是一个相对较新的补充,人们更容易将值作为参数传递
现在扩展概念,在支持时传递变量位置和关键字参数会产生上述构造。
有趣的是,通过构造仍然可以传递字典,但是负责程序员不想要的意图变得不那么明显。