2017-01-10 19 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のための年のパラメータに基づいてキャッシュ時間制限を変更したいと思います。たとえば、年が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)) 

戻っ 'DATAFRAME' オブジェクトには属性 ''

どれ指針を持っていませんか?

答えて

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

関連する問題