我的缓存函数抛出 TypeError(用 lru_cache 装饰)

My cached function throws TypeError (decorated with lru_cache)

我有一个带有 2 个参数的函数。第一个是字符串,第二个是字典:

@functools.lru_cache(maxsize=None)
def flat_map(map_: Dict[str, List[str]], start: str) -> Dict[str, List[str]]:
    if start not in map_:
        return []
    stars = map_[start] + [s for star in map_[start] for s in flat_map(star)]
    return {star: stars for star in starmap}

当 运行 这样的函数时: flat_map({'a': ['b', 'c'], 'b': ['c']}) 我得到以下错误:

TypeError: unhashable type: 'dict'

----> 1 flat_map({'a': ['b', 'c'], 'b': ['c']})

为什么会这样?如何解决?

发生这种情况是因为 functools.lru_cache 无法使用不可散列的数据结构。

来自documentations

Since a dictionary is used to cache results, the positional and keyword arguments to the function must be hashable.


关于如何解决这个问题的一些建议;

  1. 在参数中使用另一个(不可变的)数据结构来替换字典。您可以选择MappingProxyType作为示例。
  2. 您可以将不可变变量导出到嵌套函数,您可以使用 lru_cache:
  3. 对其进行修饰
    def map_flatter(starmap: Dict[str, List[str]]) -> Dict[str, List[str]]:
        @functools.lru_cache(maxsize=None)
        def flat_map(start: str) -> List[str]:
            if start not in starmap:
                return []
            stars = [s for star in starmap[start] for s in flat_map(star)]
            return starmap[start] + stars
        return {star: flat_map(star) for star in starmap}