我目前正在使用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'对象没有属性' 名称'
任何指导?
答案 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)