2015-08-28 52 views
0

我有一個我想「格式化」的熊貓時間序列,因爲我有一個天偏移量,我只想輸出系列天高於偏移量。事實上,這可以通過一個簡單的代碼行完成:對函數參數進行直接內部更改的修飾器

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' 

我在做什麼錯?

回答

2

裝飾者必須接受函數作爲唯一的參數。但是你可以通過用你需要的參數構造它來返回這樣的裝飾器函數。

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

This Works,thanks!然而,天將成爲一個整數,所以在技術上它不接受一個函數作爲它的參數,是不是裝飾者應該做什麼?此外,爲什麼你需要兩個嵌套功能,而不只是一個? – jablesauce

+2

@jablesauce請閱讀重複,這解釋了所有這一切。 – jonrsharpe