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

7

想象一下我有一个像这样的函数:

def foo(x):
    ...

使用字典 { 'x': 42, 'y': 23 } 作为关键字参数调用时,会引发 TypeError 异常:

>>> foo(**{ 'x': 42, 'y': 23 })
...
TypeError: foo() got an unexpected keyword argument 'y'

有没有一种好的方法可以使用关键字参数进行函数调用,其中额外的关键字参数只是被忽略掉?

目前我的解决方案:我可以定义一个辅助函数:

import inspect

def call_with_kwargs(func, kwargs):
    params = inspect.getargspec(func).args

    return func(**{ k: v for k,v in kwargs.items() if k in params})

现在我可以做到:
>>> call_with_kwargs(foo, { 'x': 42, 'y': 23 })
42

有更好的方法吗?

5
def func1(x, **kwargs): 可以翻译成:定义一个名为func1的函数,该函数接受一个参数x和任意数量的关键字参数kwargs。 - jonrsharpe
1
那么将func1()改为使用catch-all不是一个选项,它必须适用于所有函数吗?例如def func1(x, **kwargs): - Martijn Pieters
2
不是解决方案,但你可以将你的call_with_kwargs函数转换成装饰器。 - Julien Spronck
@jonrsharpe 是的,在我的情况下这将运作良好。非常感谢。如果您愿意,您可以回答这个问题(这样我就可以接受它了...) - Stephan Kulla
1个回答

5

如果修改函数没问题的话,那么只需在函数中添加一个万能的**kw参数即可:

def foo(x, **kw):
    # ...

忽略函数中kw捕获的任何内容。


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