gpt4 book ai didi

基于函数参数动态设置缓存的Python装饰器

转载 作者:太空宇宙 更新时间:2023-11-03 15:48:25 25 4
gpt4 key购买 nike

我目前正在使用 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 的年份参数更改缓存时间限制。例如,如果年份是 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”对象没有属性“名称

有什么指导吗?

最佳答案

您可以在装饰器函数中使用包装函数来拆分函数和参数:

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)

关于基于函数参数动态设置缓存的Python装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41559617/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com