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请阅读副本,这解释了所有这些。