Python 对函数参数进行直接内部更改的装饰器

Python 对函数参数进行直接内部更改的装饰器,python,pandas,decorator,Python,Pandas,Decorator,我有一个我想“格式化”的熊猫时间序列,在这个意义上,我有一个天的偏移量,我只想输出偏移量以上天的序列。事实上,这可以通过一行简单的代码来实现: series = series.iloc[offset:] 但我有很多情况需要这样做,所以我更喜欢更模块化的东西。我刚刚开始接触装饰师,所以我仍然发现他们很难掌握,然而,我想写一个装饰师如下: def apply_offset(series, days): def adj(*args, **kwargs): return ser

我有一个我想“格式化”的熊猫时间序列,在这个意义上,我有一个天的偏移量,我只想输出偏移量以上天的序列。事实上,这可以通过一行简单的代码来实现:

series = series.iloc[offset:]
但我有很多情况需要这样做,所以我更喜欢更模块化的东西。我刚刚开始接触装饰师,所以我仍然发现他们很难掌握,然而,我想写一个装饰师如下:

def apply_offset(series, days):
    def adj(*args, **kwargs):
        return series(*args, **kwargs).iloc[days:]
    return adj
然后将其应用于某个函数,该函数返回如下序列:

@apply_offset(200)
def ret_series(*args, **kwargs):
    # returns a series
因此,在上面的示例中,该系列应用了200天的偏移量。现在,当解释器到达装饰时,会出现一个错误,即:

TypeError: apply_offset() missing 1 required positional argument: 'offset'

我做错了什么?

装饰程序必须接受函数作为唯一的参数。但是您可以通过使用所需的参数构造它来返回这样的decorator函数

def apply_offset(days):
    def wrapper(function):
        def wrapped(*args, **kwargs):
            return function(*args, **kwargs).iloc[days:]
        return wrapped
    return wrapper

这很有效,谢谢!然而,days将是一个整数,所以从技术上讲,它不接受函数作为它的参数,这不是装饰者应该做的吗?还有,为什么需要两个嵌套函数而不是一个?@jablesauce请阅读副本,这解释了所有这些。