如何为函数缓存散列* args ** kwargs?
我正在使用xlwt
,它可以在excel文档中定义多少种样式,具有4k的限制。
通常,创建如下所示的样式:
style = xlwt.easyxf("font: bold 1")
我简单地取而代之
def cached_easyxf(self, format):
return self._cache.setdefault(format, xlwt.easyxf(format))
这完美地工作。 现在,我发现我需要传递关键字参数,这让我想到:我应该如何散列args / kwargs签名?
我应该创建一个基于str(value)的缓存键吗? 泡菜? 什么是最健壮的?
对于我的情况,它看起来像我可以将键/值转换为字符串,并将其添加到我的键...但我现在好奇的一种通用的方式来处理这种说不可能的类型,如arg=[1, 2, 3]
def cached_call(*args, **kwargs):
return cache.get(what_here)
cached_call('hello')
cached_call([1, 2, 3], {'1': True})
以下是functools.lru_cache()中使用的技术:
kwd_mark = object() # sentinel for separating args from kwargs
def cached_call(*args, **kwargs):
key = args + (kwd_mark,) + tuple(sorted(kwargs.items()))
return cache.get(key)
请注意,上面的代码处理关键字参数,但不会尝试处理像列表这样的非可哈希值。 您使用列表的想法是一个合理的开始。 对于设置对象,您需要先对条目进行排序, str(sorted(someset))
。 其他对象可能没有有用的__repr__或__str__(即它们可能只显示内存中的对象类型和位置)。 总之,处理任意不可互换的参数需要仔细考虑每个对象类型。