Python如何向目标函数传递变量和带额外参数的自定义函数
问题根因
现有general_operation调用传入的func时仅传递了x、y两个参数,无法满足带额外入参的自定义函数的调用要求,有两类成熟实现方案:
方案1:修改通用函数支持额外参数透传
直接调整general_operation的定义,新增可变参数用于接收func的额外入参,调用时自动透传,适配性最好:
def general_operation(x, y, step, func, *func_args, **func_kwargs): """ func is a function which expects at least x & y as arguments, but it can expect more arguments. """ number_of_iterations = int((y - x) / step) solutions = [] for i in range(number_of_iterations): # 透传所有额外参数给自定义函数 solutions.append(func(x, y, *func_args, **func_kwargs)) return solutions
调用示例:
# 无额外参数的调用方式完全不变 solutions_1 = general_operation(x, y, step, funza) # 位置参数传入additional=1 solutions_2 = general_operation(x, y, step, gunza, 1) # 关键字参数传入additional=2,更清晰避免参数错位 solutions_3 = general_operation(x, y, step, gunza, additional=2)
方案2:不修改通用函数,预先绑定自定义函数的额外参数
如果不方便改动general_operation的原有定义,可以通过匿名函数或者functools.partial提前把额外参数绑定到func上,无需调整原有通用函数逻辑:
用lambda实现
# 预先绑定additional=1 solutions_2 = general_operation(x, y, step, lambda x,y: gunza(x,y, 1)) # 预先绑定additional=2 solutions_3 = general_operation(x, y, step, lambda x,y: gunza(x,y, 2))
用functools.partial实现
from functools import partial solutions_2 = general_operation(x, y, step, partial(gunza, additional=1)) solutions_3 = general_operation(x, y, step, partial(gunza, additional=2))
注意:你原代码中
solutions_2的调用漏传了step参数,实际调用时需要补上否则会报参数数量不匹配错误。
内容的提问来源于stack exchange,提问作者mcp
相关产品推荐
相关产品推荐

