23

我正在使用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})
4

1 回答 1

24

这是 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的想法是一个合理的开始。对于集合对象,您需要先对条目进行排序,str(sorted(someset)). 其他对象可能没有有用的 __repr__ 或 __str__ (即它们可能只显示对象类型和内存中的位置)。总之,处理任意不可散列的参数需要仔细考虑每种对象类型。

于 2012-04-19T02:37:25.657 回答