8

我有一些看起来像这样的代码:

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,而在另一个实例中我使用了位置参数。

但是为什么

4

1 回答 1

6

创建的包装器functools.lru_cache不会尝试检查或复制包装函数的签名。Python版本定义

def wrapper(*args, **kwargs):
    ...
    key = make_key(args, kwds, typed)
    ...

如您所见,它基于argsand构建缓存中使用的键kwargs,而不知道任何位置或关键字参数是否等效。C 版本类似地构建密钥而不关心原始签名。

至于为什么会这样设计?我不知道最初的理由。这可能是经过深思熟虑的,要么是为了简化实现,要么是为了避免将关键字参数与位置匹配的开销,或者它可能是一个疏忽。如果您认为更改它是值得的,您可以在问题跟踪器上提出它。

于 2016-03-01T20:52:13.057 回答