形式**关键字的形式参数

时间:2012-04-12 19:05:32

标签: python keyword

“关键字形式的形式参数”的目的究竟是什么?我把它放在引文中,因为这就是它在文档中提到的内容,但是我很难找到它的信息,并认为可能有一个正式的术语。

据我了解,它允许用户执行类似

的操作
def foo(**keywords):
   for i in keywords:
       print(i, ":", keywords[i])

foo(val1="1", val2="2", val3="3")

输出:

val1 : 1
val2 : 2
val3 : 3

这究竟有什么优势?为了便于理解,不会传递字典变量更好吗?

4 个答案:

答案 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)

历史参数传递可以通过位置或通过关键字参数进行。将复杂对象作为参数传递是一个相对较新的补充,人们更容易将值作为参数传递

  1. 简单
  2. 可读性
  3. 现在扩展概念,在支持时传递变量位置和关键字参数会产生上述构造。

    有趣的是,通过构造仍然可以传递字典,但是负责程序员不想要的意图变得不那么明显。