Python中基于已有函数对象构造新函数,适配多参数签名的实现方法
可行实现方案
可以通过Python标准库inspect模块解析函数签名实现,无需提前知道f的参数结构,只要f的参数列表中包含名为c的入参即可适配:
import inspect def make_h(f): sig = inspect.signature(f) if "c" not in sig.parameters: raise ValueError("函数f未包含名为c的入参") def h(*args, **kwargs): # 绑定实际入参到函数签名,自动适配位置/关键字传参、默认值 bound_args = sig.bind(*args, **kwargs) bound_args.apply_defaults() c_val = bound_args.arguments["c"] x, y = f(*args, **kwargs) return x * c_val + y return h
效果验证
不同参数签名的函数都可以正确适配:
- 四参数场景
def f1(a, b, c, d): return a+b, c+d assert make_h(f1)(1,2,3,4) == 16
- 三参数(l,m,c)场景
def f2(l, m, c): return l+m, m-c assert make_h(f2)(1,2,3) == 8
- 两参数(c,r)场景
def f3(c, r): return c*r, r-c assert make_h(f3)(2,5) == 23
实现说明
inspect.signature是Python官方提供的函数签名解析工具,通过bind方法可以把任意传入的位置参数、关键字参数和函数的参数列表做映射,不管c在参数列表的哪个位置、用户用位置还是关键字形式传参,都能准确拿到c的实际取值。
内容的提问来源于stack exchange,提问作者Max M
相关产品推荐
相关产品推荐

