如何实现Python包装器逐行检查DataFrame是否为空并提前返回?
简洁解决方案:辅助函数+步骤列表
这种方式改动极小,把重复的空值检查逻辑封装到辅助函数里,原函数只需将处理步骤整理为列表循环执行,既保持可读性又避免冗余代码。
代码实现
首先定义一个辅助函数,负责执行处理操作并检查结果是否为空:
def process_step(df, func): df = func(df) # 检查DataFrame是否为空,为空则返回(空DF, False)表示终止后续操作 return (df, False) if df.empty else (df, True)
然后修改原函数,将所有处理步骤放入列表,循环执行并检查:
def test_function(test_df): # 按执行顺序列出所有处理函数 processing_steps = [do_something1, do_something2, do_something3] current_df = test_df for step in processing_steps: current_df, keep_going = process_step(current_df, step) if not keep_going: return current_df return current_df
备选方案:装饰器包装处理函数
如果不想修改原函数的调用结构,可以用装饰器给每个处理函数添加空值检查逻辑,触发空DF时抛出异常,在原函数中捕获并返回空DF:
import functools def stop_on_empty(func): @functools.wraps(func) def wrapper(df): result = func(df) if result.empty: # 自定义异常标识空DF情况 raise ValueError("Empty DataFrame encountered") return result return wrapper # 原函数只需添加异常捕获,调用方式几乎不变 def test_function(test_df): try: test_df = stop_on_empty(do_something1)(test_df) test_df = stop_on_empty(do_something2)(test_df) test_df = stop_on_empty(do_something3)(test_df) except ValueError: # 捕获异常后直接返回当前的空DF return test_df return test_df
如果允许修改do_something1/2/3的定义,还可以直接给这些函数加上@stop_on_empty装饰器,原函数的调用代码完全不用改动。
内容的提问来源于stack exchange,提问作者mollykoioga
相关产品推荐
相关产品推荐

