Python中外层函数向内层函数转发多个关键字参数的实现方法
解决参数转发的两个痛点:支持关键字参数 + 兼容单个非可迭代参数
这问题我之前也碰到过,其实只要利用Python的可变参数特性,就能同时解决你提到的两个不足。先直接上改写后的代码,再一步步解释为什么这么做:
改写后的multiply_add()函数
def multiply_add(funcs, *args, **kwargs): return sum(func(*args, **kwargs) for func in funcs)
为什么这样改能解决问题?
1. 支持关键字参数传递
通过在函数定义中加入**kwargs,外层函数可以接收任意数量的关键字参数,然后在调用内层函数时,用func(*args, **kwargs)把这些关键字参数原样传递给每个内层函数。用户再也不用死记参数顺序,直接用关键字指名传递即可。
举个例子,假设我们有两个内层函数:
def multiply(a, b): return a * b def add(a, b): return a + b
现在可以这样用关键字参数调用:
result = multiply_add([multiply, add], a=2, b=3) print(result) # 输出11(2*3 + 2+3 = 6+5)
2. 兼容单个非可迭代参数
原来的错误是因为要求用户必须传递可迭代对象,而改写后的函数用*args接收位置参数——哪怕用户只传单个非可迭代值(比如整数),*args会自动把它包装成一个元组,拆包后传给内层函数时不会触发迭代错误。
比如我们有一个只需要单个参数的内层函数:
def square(x): return x ** 2
直接传单个整数调用完全没问题:
result = multiply_add([square], 5) print(result) # 输出25
其他灵活的调用方式
你还可以混合使用位置参数和关键字参数,只要符合内层函数的参数要求就行:
result = multiply_add([multiply, add], 2, b=3) print(result) # 同样输出11
内容的提问来源于stack exchange,提问作者gnotnek
相关产品推荐
相关产品推荐

