如何优化带依赖步骤的DataFrame文本报告生成代码?
优化步骤依赖型任务的代码结构(减少嵌套IF)
原代码通过多层嵌套IF处理"前一步无结果则终止后续步骤"的依赖逻辑,但嵌套过深导致可读性差、维护成本高。下面提供两种优化方案:
方案一:步骤流水线式执行(推荐,扩展性强)
将所有步骤按顺序存入列表,循环执行时自动判断是否终止后续步骤,同时统一收集结果。这种方式彻底消除嵌套,且新增步骤只需修改配置列表,无需调整执行逻辑。
import pandas as pd # 模拟业务步骤函数(根据实际需求替换) def find_stuff(): return pd.DataFrame({'col1': [1, 2]}) def find_new_stuff(): return pd.DataFrame({'col2': [3, 4]}) def find_new_stuff_again(): return pd.DataFrame({'col3': [5, 6]}) # 步骤配置:按执行顺序定义(步骤名称,对应执行函数) steps_config = [ ("step_1", find_stuff), ("step_2", find_new_stuff), ("step_3", find_new_stuff_again) ] # 执行步骤并收集结果 step_results = {} for step_name, step_func in steps_config: current_df = step_func() step_results[step_name] = current_df if current_df.empty: # 后续步骤不执行,用空DataFrame填充 remaining_steps = [name for name, _ in steps_config if name not in step_results] for name in remaining_steps: step_results[name] = pd.DataFrame() break # 生成报告函数 def write_report(results): # 使用with语句自动管理文件资源,避免泄漏 with open("report.txt", "a") as report_file: if results["step_1"].empty: report_file.write('Nothing was found \n') return # 按顺序写入所有有数据的步骤 for step_name, df in results.items(): if not df.empty: report_file.write(f'Here what was found for {step_name} \n : {df} \n') # 触发报告生成 write_report(step_results)
方案优势:
- 彻底消除多层嵌套IF,代码结构扁平化,可读性大幅提升
- 扩展性极强:新增步骤只需在
steps_config列表中添加条目,无需修改执行逻辑 - 结果统一用字典存储,便于后续扩展其他处理逻辑
- 用
with语句管理文件,自动关闭,避免资源泄漏
方案二:卫语句提前返回(适合步骤固定的场景)
如果步骤数量固定且较少,可以用"卫语句"(提前返回)替代嵌套,每一步检查后若为空则直接生成报告并终止流程,避免嵌套层级。
import pandas as pd # 模拟业务步骤函数 def find_stuff(): return pd.DataFrame({'col1': [1, 2]}) def find_new_stuff(): return pd.DataFrame({'col2': [3, 4]}) def find_new_stuff_again(): return pd.DataFrame({'col3': [5, 6]}) def write_report(step1, step2, step3): with open("report.txt", "a") as f: if step1.empty: f.write('Nothing was found \n') return f.write(f'Here what was found for step 1 \n : {step1} \n') if step2.empty: return f.write(f'Here what was found for step 2 \n : {step2} \n') if step3.empty: return f.write(f'Here what was found for step 3 \n : {step3} \n') # 执行流程 step1 = find_stuff() if step1.empty: write_report(step1, pd.DataFrame(), pd.DataFrame()) exit() step2 = find_new_stuff() if step2.empty: write_report(step1, step2, pd.DataFrame()) exit() step3 = find_new_stuff_again() write_report(step1, step2, step3)
方案优势:
- 每一步逻辑独立,避免嵌套层级
- 代码简洁直观,适合步骤数量固定的场景
内容的提问来源于stack exchange,提问作者Tartinette
相关产品推荐
相关产品推荐

