【发布时间】:2017-10-03 12:44:58
【问题描述】:
我正在尝试在 Python3 中使用 lru_cache 来加快对 Salesforce 数据库的常见查询。下面是应该的相关代码
- a) 将不可散列的参数转换为可散列的参数,并且
- b) 为这些对象启用 LRU 缓存。
当我尝试这段代码时,缓存适用于调用不带参数的函数,但它似乎没有缓存带参数的函数调用。另外,我不确定如何为装饰功能订购装饰器。
注意,我在这里使用了一个带有类和静态方法的类,因此我可以为Resource 的不同子类覆盖get 和get_all 方法。
请解释我做错了什么或可以做得更好。
from functools import lru_cache
from functools import wraps
class Resource(object):
def hash_dict(func):
"""Transform mutable dictionnary
Into immutable
Useful to be compatible with cache
"""
class HDict(dict):
def __hash__(self):
return hash(frozenset(self.items()))
@wraps(func)
def wrapped(*args, **kwargs):
args = tuple([HDict(arg) if isinstance(arg, dict) else arg for arg in args])
kwargs = {}
for k, v in kwargs.items():
if isinstance(v, dict):
kwargs[k] = HDict(v)
elif isinstance(v, list):
kwargs[k] = tuple(v)
else:
kwargs[k] = v
return func(*args, **kwargs)
return wrapped
@staticmethod
@hash_dict
@lru_cache
def get(cls, resource_id, lang='en', fields=None):
pass
@classmethod
@hash_dict
@lru_cache
def get_all(cls, lang='en', filters=None, fields=None):
pass
【问题讨论】:
-
dicts 是故意不可散列的,添加__hash__方法实现并不能使您免于在包装方法内可能发生的kwargs突变
标签: python python-3.x lru