Python装饰器,根据函数参数动态设置缓存

时间:2017-01-10 01:05:45

标签: python caching decorator

我目前正在使用pyfscache在自定义目录中创建缓存并限制存储长度。这是我目前的代码:

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年,我想经常刷新数据并设置days = 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 个答案:

答案 0 :(得分: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)