将** kwargs注入函数以避免TypeError

时间:2017-12-03 16:41:06

标签: python

我正在使用此模块,该模块在签名中没有**kwargs的函数,因此如果我传递的参数不在那里,我会收到TypeError。我想通过以一种方式解压缩dict来调用此函数,使得签名中不存在的参数被忽略(假设它是外部模块,我无法更改签名)。

我发现this answer建议使用inspect模块从传递的dict中删除签名中不存在的所有参数。这仍然是执行此操作的唯一方法,还是在最新的Python版本中有所改变?

1 个答案:

答案 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