如何为函数缓存散列* 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__(即它们可能只显示内存中的对象类型和位置)。 总之,处理任意不可互换的参数需要仔细考虑每个对象类型。

链接地址: http://www.djcxy.com/p/18175.html

上一篇: How to hash *args **kwargs for function cache?

下一篇: Converting Python dict to kwargs?