如何向被不可修改的outer()调用的inner()传递多个参数?
解决方案
要解决这个问题,核心是利用**高阶函数(返回函数的函数)**给inner传递多参数,同时适配outer的调用逻辑——outer要求参数b是可调用对象,且会执行b = b(b)。
代码实现
# 可修改:改为高阶函数,先接收多参数,再返回适配outer的函数 def inner(x, y): def wrapper(_): # 这里可以使用传入的x、y进行业务计算 return x + y return wrapper # 不可修改 def outer(a, b): b = b(b) return a + b # 调用时给inner传入多参数,得到适配的函数传给b res = outer( a=3, b=inner(4, 5) ) print(res) # 输出 12(3 + 4+5)
逻辑解释
inner(x, y)作为高阶函数,先接收我们需要的多个参数,返回一个符合outer要求的wrapper函数。wrapper函数满足outer对b的要求:能接收一个参数(outer会把b自身传入,这里用_表示无需使用该参数),最终返回可与a相加的数值。- 调用
outer时,b=inner(4,5)会先执行inner得到wrapper函数,outer内部执行b(b)即wrapper(wrapper),返回计算结果后与a相加。
对应Airflow场景
在Airflow的ExternalTaskSensor中,execution_date_fn要求传入接收context的函数,要传递额外参数时,同样用闭包实现:
from datetime import timedelta def custom_execution_date_fn(days_offset, extra_info): def wrapper(context): # 结合传入的参数和context计算目标日期 return context['execution_date'] + timedelta(days=days_offset) return wrapper # 在Sensor中使用 ExternalTaskSensor( task_id='external_task_sensor', external_dag_id='target_dag', execution_date_fn=custom_execution_date_fn(7, 'some_info'), # 其他参数... )
内容的提问来源于stack exchange,提问作者cholz
相关产品推荐
相关产品推荐

