2016-03-08 49 views
1
class Test(object): 
    def __init__(self, id, name): 
     self.id = id 
     self.name = name 

def foo(d): 
    return Test(**d) 

# this works well 
d = {'id': 'aaa', 'name': 'aaa-name'} 
foo(d) 
# this would not work well, because of parameter variations, a external para  add into dict d. 
d = {'id': 'aaa', 'name': 'aaa-name', 'test1': 'test1'} 

# traceback 
TypeError: __init__() got an unexpected keyword argument 'test1' 

是否有任何方法可以忽略dict d的参数变化?如何忽略Python中的额外关键字参数?

+0

您通过kwargs,但你不处理它们。在初始签名中使用** kwargs或其他东西 –

+1

“处理”额外的关键字参数意味着什么?别理他们?使用它们来设置对象的属性?还有别的吗? – mhawke

+0

忽略额外的关键字参数。 – Wilence

回答

3

您可以Test.__init__接受额外**kwargs

class Test(object): 
    def __init__(self, id, name, **kwargs): 
     self.id = id 
     self.name = name 
+0

这是答案的一半。如何从这里走? –

+2

@TimCastelijns我认为这就够了,我们可以忽略'kwargs' – wong2

+0

它是否会自动从字典中的键中指定给自己? –

2

这将这样的伎俩,只需更新self.__dict__

class Test(object): 
    def __init__(self, id, name, **kwargs): 
     self.id = id 
     self.name = name 
     self.__dict__.update(kwargs) 

例子:

In[2]: class Test(object): 
    def __init__(self, id, name, **kwargs): 
     self.id = id 
     self.name = name 
     self.__dict__.update(kwargs) 
In[3]: d = {'id': 'aaa', 'name': 'aaa-name', 'test1': 'test1'} 
In[5]: t = Test(**d) 
In[6]: t.id 
Out[5]: 'aaa' 
In[7]: t.name 
Out[6]: 'aaa-name' 
In[8]: t.test1 
Out[7]: 'test1' 

编辑:

要忽略演员只是不使用kwargs在@ wong2答案:

class Test(object): 
    def __init__(self, id, name, **kwargs): 
     self.id = id 
     self.name = name 
+0

为什么不'def __init __(self,** kwargs):self .__ dict __。update(kwargs)'? – vaultah

+0

@vaultah,他可能想强制id和名称被强制int参数,所以你真的需要一个id和一个名字 – Netwave

+0

我想忽略多余的关键字参数。 – Wilence