“表单的形式参数**关键字”的目的到底是什么?我把它放在引文中,因为这是文档中提到的,但我很难找到关于它的信息,我想也许有一个正式的术语来描述它。
据我所知,它允许用户执行以下操作
def foo(**keywords):
   for i in keywords:
       print(i, ":", keywords[i])
foo(val1="1", val2="2", val3="3")输出:
val1 : 1
val2 : 2
val3 : 3这到底有什么好处呢?传递一个字典变量不是更容易理解吗?
发布于 2012-04-13 03:13:17
如果使用字典,则调用函数将如下所示:
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>这使我可以支持所有相同的论点,而不必显式列出所有论点。
发布于 2012-04-13 03:10:57
其中一种用法是当您想要转发参数时。例如:
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调用中。
它的另一个用途是在Django的信号处理程序中。在编写处理程序时,您可以将其写入以下格式
def handle_signal(sender, instance, **kwargs):因此,API可以更改为在将来传递额外的参数,而不需要用户将参数添加到一堆不使用它们的方法中。
发布于 2012-04-13 03:08:15
通过这种构造,调用者可以使用标准的关键字参数。
https://stackoverflow.com/questions/10130070
复制相似问题