Way*_*ner 5 python caching functools
我有一些看起来像这样的代码:
from functools import lru_cache
@lru_cache()
def get_cheese(type):
print('{}? We\'re all out.'.format(type))
return None
get_cheese(type='cheddar')
get_cheese('cheddar')
print(get_cheese.cache_info())
Run Code Online (Sandbox Code Playgroud)
cache_info()报告有两个遗漏-但是我使用相同的参数调用了该函数。
它实际上需要做一些事情,但我发现这是因为在一种情况下,我使用了关键字arg,而另一种情况下,我使用了位置参数。
但是为什么呢?
创建的包装器functools.lru_cache不会尝试检查或复制被包装函数的签名。Python 版本定义为
def wrapper(*args, **kwargs):
...
key = make_key(args, kwds, typed)
...
Run Code Online (Sandbox Code Playgroud)
如您所见,它基于argsand构建缓存中使用的键kwargs,而不知道任何位置或关键字参数是否等效。在C版同样构建,而无需关心原始签名的密钥。
至于为什么要这样设计?我不知道最初的理由。它可能是故意的,要么是为了简化实现,要么是为了避免将关键字参数与位置匹配的开销,或者它可能是一个疏忽。如果你认为改变它是值得的,你可以在问题跟踪器上提出它。