"typed" Python functools.lru_cache的参数无法按描述工作



我为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计算哈希键的方式进行了内部优化-如果使用类型恰好为intstr的单个参数调用函数,并且typed为False,则该参数将直接用作缓存键,而不是封装在元组中。

请注意,文档并没有确切地承诺哪些类型将被单独缓存,或者在什么情况下它们将被分别缓存。文档只说一些类型可以单独缓存,并以intstr为例。

相关内容

  • 没有找到相关文章

最新更新