我的缓存函数抛出 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
无法使用不可散列的数据结构。
Since a dictionary is used to cache results, the positional and keyword arguments to the function must be hashable.
关于如何解决这个问题的一些建议;
- 在参数中使用另一个(不可变的)数据结构来替换字典。您可以选择
MappingProxyType
作为示例。
- 您可以将不可变变量导出到嵌套函数,您可以使用
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}
我有一个带有 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
无法使用不可散列的数据结构。
Since a dictionary is used to cache results, the positional and keyword arguments to the function must be hashable.
关于如何解决这个问题的一些建议;
- 在参数中使用另一个(不可变的)数据结构来替换字典。您可以选择
MappingProxyType
作为示例。 - 您可以将不可变变量导出到嵌套函数,您可以使用
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}