与其使用自定义的可哈希字典,不如使用它,避免重新发明轮子!这是一本冻结的字典,都是可哈希的。
https://pypi.org/project/frozendict/
码:
def freezeargs(func):
"""Transform mutable dictionnary
Into immutable
Useful to be compatible with cache
"""
@functools.wraps(func)
def wrapped(*args, **kwargs):
args = tuple([frozendict(arg) if isinstance(arg, dict) else arg for arg in args])
kwargs = {k: frozendict(v) if isinstance(v, dict) else v for k, v in kwargs.items()}
return func(*args, **kwargs)
return wrapped
接着
@freezeargs
@lru_cache
def func(...):
pass
代码来自@fast_cen的答案
注意:这不适用于递归数据结构;例如,您可能有一个参数列表,该参数是不可哈希的。邀请您进行包装的递归,这样包装就可以深入数据结构并制作每个dict
冻结的list
元组。