一个装饰器,它对函数参数进行直接的内部更改

时间:2015-08-28 09:27:00

标签: python pandas decorator

我有一个Pandas时间序列,我希望"格式化#34;,从某种意义上说,我有一个天数的偏移量,我想只输出偏移量以上的天数。实际上,这可以通过一行简单的代码完成:

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'

我做错了什么?

1 个答案:

答案 0 :(得分:2)

装饰者必须接受函数作为唯一的参数。但是你可以通过用你需要的参数构造它来返回这样的装饰器函数。

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