我的缓存函数抛出TypeError(用lru_cache装饰) 发生这种情况是因为functools.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:不可散列的类型:'dict'

     

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

为什么会发生?如何解决?

downcrazy 回答:我的缓存函数抛出TypeError(用lru_cache装饰) 发生这种情况是因为functools.lru_cache无法使用不可散列的数据结构。

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

来自documentations

  

由于使用字典来缓存结果,因此该函数的位置和关键字参数必须是可哈希的。


关于如何解决此问题的建议很少;

  1. 在参数中使用另一个(不可变的)数据结构来替换字典。您可以选择MappingProxyType作为示例。
  2. 您可以将不可变变量导出到嵌套函数中,可以使用lru_cache进行修饰:
    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}
本文链接:https://www.f2er.com/2959928.html

大家都在问