首页 > 解决方案 > 如何将 functools.cache 包装在另一个装饰器中?

问题描述

我正在尝试制作一个包装器,functools.cache以便它仅在self.use_cache为真时触发。

我在正确使用语法时遇到了很多麻烦。每次我包装lru_cachecache将包装的函数视为函数的唯一实例,并且不缓存它。任何人都可以帮助指导我吗?

import functools

def cache():
    return functools.cache if self.use_cache else lambda x: x

@dataclass
class F5Query():
    use_cache: bool = True

    __hash__(self): 
        return hash(self.use_cache)

    @cache
    def _test_cache(self, input):
        """Return the same number each time if cache is working."""
        from uuid import uuid4
        return uuid4()

标签: python

解决方案


你可以尝试这样的事情:

import uuid
import functools
import dataclasses

def cache(func):
    def inner(self, *args, **kwargs):
        new_func = functools.cache(func) if self.use_cache else func
        return new_func(self, *args, **kwargs)
        
    return inner

@dataclasses.dataclass
class F5Query():
    use_cache: bool = True

    @cache
    def test_cache(self):
        return uuid.uuid4()
        
query = F5Query(use_cache=True)
first = query.test_cache()
assert query.test_cache() == first

query = F5Query(use_cache=False)
first = query.test_cache()
assert query.test_cache() != first

推荐阅读