首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >表单形参**关键字

表单形参**关键字
EN

Stack Overflow用户
提问于 2012-04-13 03:05:32
回答 4查看 1.9K关注 0票数 1

“表单的形式参数**关键字”的目的到底是什么?我把它放在引文中,因为这是文档中提到的,但我很难找到关于它的信息,我想也许有一个正式的术语来描述它。

据我所知,它允许用户执行以下操作

代码语言:javascript
运行
复制
def foo(**keywords):
   for i in keywords:
       print(i, ":", keywords[i])

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

输出:

代码语言:javascript
运行
复制
val1 : 1
val2 : 2
val3 : 3

这到底有什么好处呢?传递一个字典变量不是更容易理解吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-04-13 03:13:17

如果使用字典,则调用函数将如下所示:

代码语言:javascript
运行
复制
myfunv({"key1": "value1", "key2": "value2"})

使用**kwargs这就变成了

代码语言:javascript
运行
复制
myfunc(key1="value1", key2="value2")

很多人更喜欢后者。

当您透明地将参数传递给另一个函数或类时,此构造也非常有用。例如,在对Tkinter小部件进行子类化时,我经常使用它。我想要支持基类的所有选项,所以我这样编写代码:

代码语言:javascript
运行
复制
class MyFrame(tk.Frame):
    def __init__(self, *args, **kwargs):
        tk.Frame.__init__(self, *args, **kwargs)
        <more code here>

这使我可以支持所有相同的论点,而不必显式列出所有论点。

票数 2
EN

Stack Overflow用户

发布于 2012-04-13 03:10:57

其中一种用法是当您想要转发参数时。例如:

代码语言:javascript
运行
复制
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的信号处理程序中。在编写处理程序时,您可以将其写入以下格式

代码语言:javascript
运行
复制
def handle_signal(sender, instance, **kwargs):

因此,API可以更改为在将来传递额外的参数,而不需要用户将参数添加到一堆不使用它们的方法中。

票数 1
EN

Stack Overflow用户

发布于 2012-04-13 03:08:15

通过这种构造,调用者可以使用标准的关键字参数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10130070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档