python - 如何将 functools.cache 包装在另一个装饰器中?
问题描述
我正在尝试制作一个包装器,functools.cache
以便它仅在self.use_cache
为真时触发。
我在正确使用语法时遇到了很多麻烦。每次我包装lru_cache
或cache
将包装的函数视为函数的唯一实例,并且不缓存它。任何人都可以帮助指导我吗?
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()
解决方案
你可以尝试这样的事情:
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
推荐阅读
- python - 根据来自其他数据框的匹配更新数据框新列
- php - Blade 在尝试显示 Json 数据时返回“1”
- c++ - 如何使用c++交换功能?
- mysql - R 使用 RMariaDB 无法连接 .mylogin.cnf
- spring-mvc - 将 Spring 从 Jboss 迁移到 Wildfly 将导致“无法自动装配”
- extjs - 在 Ext.grid.Panel 中自动选择第一行
- sql - SQL 最少收入位置计数
- java - 如果在 GUI 中未添加任何数据,我将收到用于警告消息场景的 Java GUI 的 NullPointerException
- angular - 当使用 Angular Material 拖放项目以在列表中交换它们时,我的 event.currentIndex 是错误的
- javascript - 在 Quill 编辑器中嵌入自定义内联印迹后插入未定义的印迹