如何在Python中忽略额外的关键字参数?

Wil*_*nce 3 python

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'
Run Code Online (Sandbox Code Playgroud)

是否有任何方法可以忽略dict d的参数变化?

Net*_*ave 8

这将解决问题,只需更新 self.__dict__

class Test(object):
    def __init__(self, id, name, **kwargs):
        self.id = id
        self.name = name
        self.__dict__.update(kwargs)
Run Code Online (Sandbox Code Playgroud)

例子:

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'
Run Code Online (Sandbox Code Playgroud)

编辑:

要忽略额外内容,请不要像@wong2 答案中那样使用 kwargs:

class Test(object):
    def __init__(self, id, name, **kwargs):
        self.id = id
        self.name = name
Run Code Online (Sandbox Code Playgroud)


won*_*ng2 5

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

class Test(object):
    def __init__(self, id, name, **kwargs):
        self.id = id
        self.name = name
Run Code Online (Sandbox Code Playgroud)

  • @TimCastelijns我认为就足够了,我们可以忽略`kwargs` (2认同)
  • @TimCastelijns:平心而论,OP 并没有真正解释“处理”额外的 kwargs 是什么意思。在这一点上忽略它们是完全有效的。使用它们来设置对象的属性也可能是有效的。 (2认同)