Python中如何通用化main_func以适配任意多额外参数的目标函数
错误原因
原封装函数main_func存在两个核心问题:
- 硬编码仅取
arg的第一个元素arg[0]传递给被调用函数,无论你传入的arg包含多少个额外参数,都只会传给第三个位置,导致需要多参数的new_func收不到b而报错。 - 单元素元组的写法容易出错:Python中
arg=(a)本质不是元组,只是加了括号的单个变量,单元素元组必须写成arg=(a,)。
通用化修改方案
利用Python的元组解包语法*,将arg中包含的所有额外参数按顺序解包传递给被调用函数,即可适配任意数量的额外位置参数。修改后的main_func无需改动原有调用逻辑,代码如下:
def main_func(func, arg=()): # 固定的y=1、t=2可根据需求调整为动态传入参数 fixed_y = 1 fixed_t = 2 # 解包arg的所有元素为位置参数传入 sol = func(fixed_y, fixed_t, *arg) return sol
兼容性测试示例
测试单额外参数的原函数
def func(y,t,a): z=y dydt=[t*z+a] return dydt a=1 # 注意单参数元组要加逗号 print(main_func(func, arg=(a,))) # 输出结果:[3] (计算逻辑:2*1 + 1 = 3)
测试双额外参数的新函数
def new_func(y,t,a,b): z=y dydt=[t*z+a+b] return dydt a=1 b=2 print(main_func(new_func, arg=(a,b))) # 输出结果:[5] (计算逻辑:2*1 + 1 + 2 = 5)
后续如果需要支持3个、4个甚至更多额外参数的函数,只需对应修改被调用函数的参数列表、在arg元组中添加对应元素即可,无需再修改main_func。
内容的提问来源于stack exchange,提问作者Suman Mandal
相关产品推荐
相关产品推荐

