Python 为什么我的LRU缓存丢失了相同的参数?

Python 为什么我的LRU缓存丢失了相同的参数?,python,caching,functools,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()) cache_info()报告有两次未命中,但我使用

我有一些代码如下所示:

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())
cache_info()
报告有两次未命中,但我使用相同的参数调用了该函数

这实际上需要做一些工作,但我发现这是因为在一个例子中我使用了关键字arg,而在另一个例子中我使用了位置参数


但是为什么呢?

functools.lru\u cache
创建的包装不会尝试检查或复制包装函数的签名。Python版本如下所示

如您所见,它基于
args
kwargs
构建缓存中使用的密钥,而不知道任何位置参数或关键字参数是否等效。类似地,在不考虑原始签名的情况下构建密钥


至于为什么它是这样设计的?我不知道最初的理由。它可能是经过深思熟虑的,要么是为了实现的简单性,要么是为了避免将关键字参数匹配到位置的开销,要么就是一种疏忽。如果您认为更改它是值得的,您可以将其提出来。

是的,缓存可能不是我真正的问题所在,但处理缓存是我遇到这个问题的原因,因此我认为这可能是一个合理的标记……值得注意的是:关键字是,所以您提供关键字的顺序不重要,你就是这么做的。我确实考虑过在问题跟踪器上提出来…但我真的认为这是正确的方法,它只需要更好的文档。我真的没有看到任何关于这种行为的参考
def wrapper(*args, **kwargs):
    ...
    key = make_key(args, kwds, typed)
    ...