我正在尝试使用functools.lru_cache
缓存内部函数的结果,但缓存似乎没有按预期工作。
我有一个函数执行一些逻辑,然后调用一个相当昂贵的函数。我想缓存昂贵的函数调用的结果,尽管我只是应用lru_cache
到一个内部函数。不幸的是,行为并不符合预期——即使内部函数的参数相同,每次都会调用昂贵的函数。
我创建了一个(简化的)测试用例来显示行为:
import unittest
from functools import lru_cache
from unittest.mock import patch
def expensive_function(parameter: str) -> str:
return parameter
def partially_cached(some_parameter: str) -> str:
@lru_cache
def inner_function(parameter: str):
return expensive_function(parameter)
result = inner_function(some_parameter)
print(inner_function.cache_info())
return result
class CacheTestCase(unittest.TestCase):
def test_partially_cached(self):
with patch(self.__module__ + ".expensive_function") as expensive_mock:
expensive_mock.return_value = "a"
self.assertEqual(partially_cached("a"), "a")
self.assertEqual(partially_cached("a"), "a")
# If the cache works, I expect the expensive function
# to be called just once for the same parameter
expensive_mock.assert_called_once()
if __name__ == "__main__":
unittest.main()
(在这种情况下,我不需要内部函数,但正如我所说 - 它被简化了)
不幸的是测试失败了
python3 /scratch/test_cache.py
CacheInfo(hits=0, misses=1, maxsize=128, currsize=1)
CacheInfo(hits=0, misses=1, maxsize=128, currsize=1)
F
======================================================================
FAIL: test_partially_cached (__main__.CacheTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
[...]
AssertionError: Expected 'expensive_function' to have been called once. Called 2 times.
Calls: [call('a'), call('a')].
----------------------------------------------------------------------
Ran 1 test in 0.004s
FAILED (failures=1)
我可能对内部函数或 lru_cache 有误解,但我不确定它是什么 - 我感谢我能得到的所有帮助。