我正在使用此模块,该模块在签名中没有**kwargs
的函数,因此如果我传递的参数不在那里,我会收到TypeError
。我想通过以一种方式解压缩dict来调用此函数,使得签名中不存在的参数被忽略(假设它是外部模块,我无法更改签名)。
我发现this answer建议使用inspect
模块从传递的dict中删除签名中不存在的所有参数。这仍然是执行此操作的唯一方法,还是在最新的Python版本中有所改变?
答案 0 :(得分:0)
我使用装饰器内部的inspect模块解决了这个问题,因为它似乎不是另一种方式。我是Python 3.6.2。
import inspect
from functools import wraps
def inject_kwargs(f):
@wraps(f)
def wrapped(*args, **kwargs):
argspec = inspect.getfullargspec(f)
if not argspec.varkw: # function does not accept arbitrary keywords arguments
return f(*args, **{k: kwargs[k] for k in kwargs if k in argspec.args})
else:
return f(*args, **kwargs)
return wrapped
@inject_kwargs
def test(foo=None, bar=None):
print(foo, bar)
x = {'bar': 1, 'baz': 2}
test(**x) # now prints (None, 1) without raising any error