You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现装饰器为无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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 06:29:57