【问题标题】:My cached function throws TypeError (decorated with lru_cache)我的缓存函数抛出 TypeError(用 lru_cache 装饰)
【发布时间】:2020-03-31 21:19:45
【问题描述】:

我有一个带有 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']})

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

【问题讨论】:

    标签: python python-3.x caching typeerror mutability


    【解决方案1】:

    这是因为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}
    

    【讨论】:

      猜你喜欢
      • 2021-03-28
      • 1970-01-01
      • 2022-01-01
      • 2018-01-02
      • 1970-01-01
      • 2018-09-01
      • 2022-12-14
      • 2019-02-19
      • 2015-07-29
      相关资源
      最近更新 更多