解决办法:

import pandas as pd
from functools import wraps

def isEmpty_df(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        if len(args) > 0:
            df = args[0]
        else:
            df = list(kwargs.values())[0]
        if df.empty:
            return 2  # 不执行func(df)
        return func(*args, **kwargs)
    return wrapper

@ isEmpty_df
def func(df: pd.DataFrame, other):
    return 1

if __name__ == "__main__":
    df = pd.DataFrame([1])
    res = func(df, 1)  # 只要保证df是传入的第一个自变量即可
    print(res)


问题背景:

import pandas as pd
from functools import wraps

def isEmpty_df(func):
    @wraps(func)
    def wrapper(df):
        if df.empty:
            return 2  # 不执行func(df)
        return func(df)
    return wrapper

@ isEmpty_df
def func(df: pd.DataFrame, other):
    return 1

if __name__ == "__main__":
    df = pd.DataFrame()
    res = func(df, other=1)  # TypeError: func() takes 1 positional argument but 2 were given
    print(res)


import pandas as pd
from functools import wraps

def isEmpty_df(func):
    @wraps(func)
    def wrapper(df):
        if df.empty:
            return 2  # 不执行func(df)
        return func(df)
    return wrapper

@ isEmpty_df
def func(df: pd.DataFrame, other):
    return 1

if __name__ == "__main__":
    df = pd.DataFrame()  # 执行func
    res = func(df)  # 实际上是传到wrapper
    print(res)
import pandas as pd
from functools import wraps

def isEmpty_df(func):
    @wraps(func)
    def wrapper(df):
        if df.empty:
            return 2  # 不执行func(df)
        return func(df)
    return wrapper

@ isEmpty_df
def func(df: pd.DataFrame, other):
    return 1

if __name__ == "__main__":
    df = pd.DataFrame([1])
    res = func(df)  # TypeError: func() missing 1 required positional argument: 'other'
    print(res)