Python如何传递需传参的函数暂不传参,后续调用时再传参?
Python延迟传参的实现方法
带括号的add()写法会立刻执行函数,此时缺少必填参数会直接抛出TypeError。要实现传递函数时暂不执行、进入目标函数后再补全参数调用的效果,可根据实际场景选择以下方案:
方案1:直接传递函数对象(无预绑定参数场景)
Python中函数是一等公民,可直接作为对象传递。只要去掉调用时的括号,把函数名传入即可,等进入目标函数后再加括号传参调用,完全匹配你给出的示例逻辑。
修正后的可运行代码:
def add(a,b): return a + b def multiply(a,b): return a * b def destination(variable, func): c = 5 d = 3 e = func(c , d) * variable return e s = 10 # 去掉括号,直接传函数对象本身,不会立刻执行 output1 = destination(s, add) output2 = destination(s, multiply) print(output1) # 输出80,计算逻辑:(5+3)*10 print(output2) # 输出150,计算逻辑:(5*3)*10
方案2:用functools.partial预绑定部分参数
如果需要提前给待传递函数固定一部分参数,剩余参数等进入目标函数后再传入,可以用Python标准库functools中的partial工具,它会返回一个待调用的包装对象,不会立刻执行原函数。
示例:提前固定add的第一个参数为2,只留第二个参数等待目标函数传入
from functools import partial def add(a,b): return a + b def destination(variable, func): d = 3 # 调用时只需要传入未被预绑定的参数 e = func(d) * variable return e s = 10 # 预绑定a=2,此时不会执行add函数 output = destination(s, partial(add, 2)) print(output) # 输出50,计算逻辑:(2+3)*10
方案3:用lambda匿名函数灵活包装
如果需要自定义参数传递逻辑(比如调整参数顺序、对传入参数做额外计算),可以用lambda表达式包装原函数,lambda定义时不会执行内部逻辑,只有被目标函数调用时才会运行。
示例:将目标函数传入的两个参数调换顺序后传给multiply
def multiply(a,b): return a * b def destination(variable, func): c = 5 d = 3 e = func(c , d) * variable return e s = 10 # 用lambda包装,调用时调换c、d的传入顺序 output = destination(s, lambda x, y: multiply(y, x)) print(output) # 输出150,计算逻辑:(3*5)*10
内容的提问来源于stack exchange,提问作者JakubNowek
相关产品推荐
相关产品推荐

