我为Python的functools.lru_cache
装饰器使用typed
参数的最初经验给我的结果似乎与它的描述不匹配这似乎不太可能是一个错误,所以我想我做错了什么
引用Python关于typed
行为的文档(可从内置的help
中获得(:
如果类型为True,则不同类型的参数将分别缓存。例如,f(3.0(和f(3(将被视为不同的调用不同的结果。
我下面的例子(用Python 3.10.4测试(使用了,我认为与上面引用的文档中描述的情况类似,但我的结果表明,函数参数的类型确实很重要,即使typed
设置为False
也是如此。
>>> import functools
>>> @functools.lru_cache(maxsize=128, typed=False)
... def f(v):
... print("Called 'f'")
... return v + 1
...
>>> f(4)
Called 'f'
5
>>> f(4.)
Called 'f'
5.0
>>> f.cache_info()
CacheInfo(hits=0, misses=2, maxsize=128, currsize=2)
>>> # No hits - this would seem to contradict the documentation
>>> # Repeating the same exact calls as before, DOES produce hits
>>> f(4)
5
>>> f(4.)
5.0
>>> f.cache_info()
CacheInfo(hits=2, misses=2, maxsize=128, currsize=2)
虽然网上有很多对functools.lru_cache
的引用,但我找不到任何真正包含typed
行为显著的代码示例。因此,我不知所措。
您查看了help
的输出,遗憾的是,它在这里并不完整。在线文档显示
(一些类型,如str和int,即使类型为false,也可以单独缓存。(
这是由于lru_cache
计算哈希键的方式进行了内部优化-如果使用类型恰好为int
或str
的单个参数调用函数,并且typed
为False,则该参数将直接用作缓存键,而不是封装在元组中。
请注意,文档并没有确切地承诺哪些类型将被单独缓存,或者在什么情况下它们将被分别缓存。文档只说一些类型可以单独缓存,并以int
和str
为例。