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

6
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'

有没有方法可以忽略字典 d 参数变化的影响?

你传递了kwargs,但是你没有处理它们。在init签名中使用**kwargs或其他方法。 - Tim
1
“处理”额外的关键字参数是什么意思?忽略它们?使用它们来设置对象的属性?还是其他什么? - mhawke
忽略额外的关键字参数。 - Wilence
2个回答

12

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

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

1
这只是答案的一半。接下来该怎么做? - Tim
3
@TimCastelijns 我认为这已经足够了,我们可以简单忽略 kwargs - wong2
它是否会自动从字典中的键分配给self? - Tim
2
@TimCastelijns:公平地说,OP并没有真正解释“处理”额外的kwargs是什么意思。在这一点上,忽略它们是完全有效的。使用它们来设置对象属性也可能是有效的。 - mhawke
@mhawke 说得对。然而,在不清楚 OP 到底在问什么的情况下,最好不要回答,直到澄清为止。现在我们只能猜测。 - Tim
@TimCastelijns:很好。这就是为什么我问OP想要什么的原因?他们的回答是应该忽略额外内容。 - mhawke

10
这很简单,只需更新 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'

编辑:

如果想忽略附加参数,只需像@wong2的答案中那样不使用kwargs即可:

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

为什么不用 def __init__(self, **kwargs): self.__dict__.update(kwargs) - vaultah
@vaultah,他可能想要强制将id和name强制放入params中,因此您确实需要一个id和一个name。 - Netwave
我想要忽略掉额外的关键字参数。 - Wilence
@Wilence请看我的回答。 - wong2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接