【问题标题】:A decorator that makes direct, internal changes to the function argument [duplicate]对函数参数进行直接内部更改的装饰器[重复]
【发布时间】:2015-11-22 22:02:14
【问题描述】:

我有一个我想“格式化”的 Pandas 时间序列,因为我有一个天数的偏移量,我只想输出高于偏移量天数的序列。事实上,这可以通过简单的一行代码来完成:

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'

我做错了什么?

【问题讨论】:

    标签: python pandas decorator


    【解决方案1】:

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

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

    【讨论】:

    • 这行得通,谢谢!然而,days 将是一个整数,所以从技术上讲,这不接受一个函数作为它的参数,这不是装饰器应该做的吗?还有为什么你需要两个嵌套函数而不是一个?
    • @jablesauce 请阅读副本,它解释了所有这些。
    猜你喜欢
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 2018-05-24
    • 2011-10-04
    • 2023-03-26
    • 2017-05-26
    相关资源
    最近更新 更多