2017-01-10 52 views
0

我目前使用pyfscache在自定義目錄中創建緩存並限制存儲的長度。這是我當前的代碼:基於函數參數動態設置緩存的Python裝飾器

Import pyfscache 
Import pandas as pd 

def cache_one_day(func): 
    years = 0 
    days = 1 
    cache = pyfscache.FSCache(CACHE_DIRECTORY, years=years, days=1) 
    return cache(func) 

@cache_one_day 
def get_data(year): 
    columns = [str(year), str(year + 1), str(year + 2)] 
    data = [1, 2, 3] 
    df = pd.DataFrame(data, columns=columns) 
    return df 

我還想根據get_data的year參數更改緩存時間限制。例如,如果年份是2017年,我想經常刷新數據並設置天數= 1(如圖所示)。但如果是2015年,我已經知道數據不會改變,我更願意創建年份爲99的存檔。

我知道我可以在get_data函數中編寫if語句,但這不是'我想使用這個邏輯的唯一功能。因此,我寧願使用別的東西。我已經看過類裝飾器和分層裝飾器,並試圖寫每個,但我得到的錯誤。例如,下面的代碼:

class my_decorator(object): 

    def __init__(self, view_func): 
     self._years = 0 
     self._seconds = 0 
     self.view_func = view_func 
     wraps(view_func)(self) 

    def __call__(self, request, *args, **kwargs): 
     if request == 2017: 
      self._seconds = 1 
     else: 
      self._years = 1 
     cache = pyfscache.FSCache(CACHE_DIRECTORY, years=self._years, 
            seconds=self._seconds) 
     return cache(self.view_func(request, *args, **kwargs)) 

返回 '數據幀' 對象有沒有屬性 ''

任何指導意見?

回答

1

你可以使用一個包裝函數在你的裝飾功能拆分功能和參數:

def cache_one_day(fn): 
    def wrapper(*args, **kw): 
     # args[0] --> years (2017) 
     # cache = ... 
     return fn(*args,**kw) 
    return wrapper 

@cache_one_day 
def get_data(year): 
    columns = [str(year), str(year + 1), str(year + 2)] 
    data = [1, 2, 3] 
    df = pd.DataFrame(data, columns=columns) 
    return df 

get_data(2017) 
+0

我試過,但它給我的方式pyfscache作品的錯誤。我想我不得不考慮編寫自己的緩存系統。 – exballer