pandas 自定义python装饰器在每行后检查函数

0wi1tuuw  于 2023-04-10  发布在  Python
关注(0)|答案(2)|浏览(109)

下面是一个示例函数:

def test_function(test_df):
    test_df = do_something1(test_df)
    test_df = do_something2(test_df)
    test_df = do_something3(test_df)
    return test_df

这里我输入一个pandas Dataframe ,在输入的 Dataframe 上调用一些其他函数,并在最后输出它。
我的问题是,有没有一种方法可以定义Python Package 器(或任何其他方法),检查后,每一行,如果你输入的 Dataframe (test_df)是空的,如果是,返回一个空的dataframe?我这样做的目的是,如果这些函数中的任何一个过滤数据,使test_df为空,代码将在任何后续的函数调用中中断。我正在寻找的 Package 器的等效函数是:

def test_function(test_df):
    test_df = do_something1(test_df)
    if test_df.empty:
        return pd.DataFrame()
    test_df = do_something2(test_df)
    if test_df.empty:
        return pd.DataFrame()
    test_df = do_something3(test_df)
    return test_df

我认为对于一些函数调用,空检查是好的,但认为这会降低可读性,并且随着函数调用的数量增加,它会变得越来越混乱。
我已经看过定义自定义 Package 器,但它们似乎将函数作为一个整体来看待,而不是逐行地看待。我也看过上下文管理器,但它似乎不太符合我的目的。不是真的想改变代码太多,因此为什么一个好的 Package 器是理想的。任何其他具有相同输出的干净解决方案都一样好。

9gm1akwq

9gm1akwq1#

我只使用一个循环。

def test_function(test_df):
    for f in [do_something1, do_something2, do_something3]:
        test_df = f(test_df)
        if test_df.empty:
            return pd.DataFrame()
    return test_df
hts6caw3

hts6caw32#

装饰器并不是用来修改被装饰的函数的内容的。所以,根据你的问题,你不能(或者至少不应该)为test_function创建一个装饰器。当你想在函数调用之前和/或之后添加一些行为时,它们最好用。
如果你想要一个装饰器,你可以在你调用的函数上使用它,它看起来像这样:

# the decorator is handed the function being decorated
def decorator(func):
    # define a function that will be called instead
    # of the decorated function
    def wrapper(df):
        # call the function being decorated
        result = func(df)
        if result.empty:
            return pd.DataFrame()
        return result
    # return the function that will replace
    # the function being decorated
    return wrapper

@decorator
def do_something1(df):
    # some code
    return df

@decorator
def do_something2(df):
    # some code
    return df

@decorator
def do_something3(df):
    # some code
    return df

def test_function(test_df):
    test_df = do_something1(test_df)
    test_df = do_something2(test_df)
    test_df = do_something3(test_df)
    return test_df

修饰一个函数相当于这样:

def decorator(func):
    def wrapper(df):
        result = func(df)
        if result.empty:
            return pd.DataFrame()
        return result
    return wrapper

# The function to decorate
def do_something2(df):
    return df

do_something2 = decorator(do_something2)

您可以有效地用函数的 Package 版本替换该函数。
或者,您可以只为结果创建一个 Package 器,这意味着不需要向定义中添加额外的代码。

def workable_result(df):
    if df.empty:
        return pd.DataFrame()
    return df

def test_function(test_df):
    test_df = workable_result(do_something1(test_df))
    test_df = workable_result(do_something2(test_df))
    test_df = do_something3(test_df)
    return test_df

相关问题