2012-03-09 32 views
1

我看到下面的代码:Python的符号或操作 “**”

def __init__(self, fn, **kw): 
    [setattr(self,k,v) for (k,v) in kw.items()] 
    ...... 

什么是输入参数**kw是什么意思?

+1

http://stackoverflow.com/questions/1769403/understanding-kwargs-in-python – San4ez 2012-03-09 18:14:11

回答

5

kw绑定到dictkeyword argument名称映射到它们的值。

尝试调用

def return_kwargs(**kw): 
    return kw 

return_kwargs(foo=1, bar="2", baz="hamspamspam")

+0

所以。假设班级的名字是Foo。然后我可以创建它:F =(Foo,a,b,c,d,e)。那么kw == {b:c,d:e} ??? – 2012-03-09 18:19:03

+1

@YanZhu:不,因为你(a)不会创建'Foo',(b)如果你的意思是'Foo(a,b,c,d,e)',它不会传递关键字参数,但值'a'到'e'。阅读我发布的链接。 – 2012-03-09 18:30:04

1

假设你有一个dict kw = {'a':1,'b':2},那么调用myfunction(**kw)就相当于调用myfunction(a=1,b=2)

+0

这与在函数声明中使用'** kw'相反。当然,相似性不是偶然的。 – alexis 2012-03-09 18:58:15

1

这个特殊的构造意味着构造函数的所有关键字参数最终都会作为对象属性。

foo = Foo(func, bar = 1, baz = "aa") 

这将创建一个属性“栏”的对象设定为1,“巴兹”到“AA”

+0

你是对的,但他只是在问'** kw'部分。属性magic由'setattr()'完成。 – alexis 2012-03-09 18:56:52

1

功能里面,kw是包含所有关键字=值参数的字典,您给你的功能:

def demo(**kw): 
    print kw 

demo(a=1, b="hello") 

运行上述,它会显示一个字典与两个键,a和b。因此,它可以用作接受您在调用函数时决定使用的任何关键字参数的方法。

这就是它的作用。为什么有人想要这样做?也许在调用另一个函数的函数中(作为单独的参数给出),并且**kw将保存第二个函数的选项。