向函数中注入**kwargs以避免TypeE

2024-04-19 00:27:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用这个模块,它有一个签名中没有**kwargs的函数,因此如果我传递一个不在那里的参数,我会收到一个TypeError。我想通过解压dict来调用这个函数,这样签名中不存在的参数就被忽略了(假设因为它是一个外部模块,所以我不能更改签名)。你知道吗

我发现this answer建议使用inspect模块从传递的dict中删除签名中不存在的所有参数。这仍然是唯一的方法还是在最新的Python版本中有什么改变?你知道吗


Tags: 模块方法函数answer版本参数this建议
1条回答
网友
1楼 · 发布于 2024-04-19 00:27:17

我使用装饰器中的inspect模块解决了这个问题,因为似乎没有其他方法可以解决这个问题。我使用的是python3.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

相关问题 更多 >