【问题标题】:Python decorator that dynamically sets cache based on function parameter基于函数参数动态设置缓存的 Python 装饰器
【发布时间】:2017-05-24 09:34:15
【问题描述】:

我目前正在使用 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' 对象没有属性 'name'

有什么指导吗?

【问题讨论】:

    标签: python caching decorator


    【解决方案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)
    

    【讨论】:

    • 我试过了,但是 pyfscache 的工作方式给了我一个错误。我想我将不得不考虑编写自己的缓存系统。
    猜你喜欢
    • 2012-03-14
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多