Python递归或链式调用函数时如何保留并获取所有返回的DataFrame
解决方案
方案1:最小改动适配原有逻辑
你只需要修改fun2的返回值,将需要保留的df1、df2和新增的df3按顺序返回即可,原有循环逻辑不需要做任何调整:
# 修改fun2的返回语句 def fun2(df1,df2): ... df3 = df1.merge(df2) # 原有逻辑不变,仅修改返回值为三个对象 return df1, df2, df3
函数链执行完成后,op_data会自动变成包含三个对象的元组,直接解包就可以访问三个对象:
funcs = [fun1, fun2] op_data = [] for func in funcs: op_data = func(*op_data) # 执行完成后直接解包即可 df1, df2, df3 = op_data
如果你后续需要在funcs中新增更多函数,只需要保证后一个函数的入参数量和前一个函数的返回值数量匹配即可,链式调用逻辑无需修改。
方案2:上下文字典方案(适合长函数链拓展)
如果你后续会新增更多函数,不想频繁调整参数数量匹配规则,可以统一用字典作为上下文承载所有中间结果:
# 所有函数统一接收字典参数,返回修改后的字典 def fun1(ctx=None): ctx = ctx or {} # 原有业务逻辑不变 ctx["df1"] = df1 ctx["df2"] = df2 return ctx def fun2(ctx): # 原有业务逻辑不变 df3 = ctx["df1"].merge(ctx["df2"]) ctx["df3"] = df3 return ctx # 调用逻辑调整为传入空字典作为初始上下文 funcs = [fun1, fun2] op_data = {} for func in funcs: op_data = func(op_data) # 最终可以从上下文中取出任意阶段的中间结果 print(op_data["df1"], op_data["df2"], op_data["df3"])
这种方案的优势是拓展性强,新增函数不需要调整参数数量,所有中间结果随时可以提取,不需要跟着返回值顺序做调整。
内容的提问来源于stack exchange,提问作者The Great
相关产品推荐
相关产品推荐

