【发布时间】:2021-12-17 09:43:49
【问题描述】:
我不明白functools.lru_cache 如何处理对象实例。
我假设该类必须提供一个__hash__ 方法。所以任何具有相同哈希的实例都应该hit缓存。
这是我的测试:
from functools import lru_cache
class Query:
def __init__(self, id: str):
self.id = id
def __hash__(self):
return hash(self.id)
@lru_cache()
def fetch_item(item):
return 'data'
o1 = Query(33)
o2 = Query(33)
o3 = 33
assert hash(o1) == hash(o2) == hash(o3)
fetch_item(o1) # <-- expecting miss
fetch_item(o1) # <-- expecting hit
fetch_item(o2) # <-- expecting hit BUT get a miss !
fetch_item(o3) # <-- expecting hit BUT get a miss !
fetch_item(o3) # <-- expecting hit
info = fetch_item.cache_info()
print(info)
assert info.hits == 4
assert info.misses == 1
assert info.currsize == 1
如何缓存具有相同哈希的对象实例的调用?
【问题讨论】: