如何实现装饰器为无kwargs的函数添加kwargs参数支持?
问题:为无**kwargs参数的函数添加参数支持,避免运行时性能开销
我有上百个类似以下的函数,部分带有**kwargs参数,部分没有:
def test1(x, z=1, **kwargs): pass def test2(x, y=1): pass def test3(x, y=1, z=1): pass ...
同时定义了call_center函数,用来批量调用这些测试函数:
tests = [test1, test2, test3] def call_center(**kwargs): for test in tests: test(**kwargs)
call_center会被传入不同参数调用,例如:
call_center(x=1,y=1) call_center(x=1,z=1)
由于这些函数会被调用数百万次,我不想在运行时通过inspect.signature过滤kwargs——这种方式性能开销太大。请问如何定义extend_kwargs装饰器,为没有**kwargs参数的函数添加该参数支持?
我曾尝试通过检查函数签名判断是否存在kwargs,并尝试修改函数签名或__code__属性,但均未生效。最终找到可行方案如下:
import inspect def extender(func): if not func.__code__.co_flags & inspect.CO_VARKEYWORDS: code = func.__code__ func.__code__ = code.replace( co_flags=code.co_flags | inspect.CO_VARKEYWORDS, co_varnames=code.co_varnames + ("kwargs",), co_nlocals=code.co_nlocals + 1, ) return func
如果不想直接修改原函数,可以参考原问题的最优解。
内容的提问来源于stack exchange,提问作者lei zhang
相关产品推荐
相关产品推荐

