我正在研究Python的最近最少使用(LRU)缓存实现here。
有人能解释一下_make_key
函数在做什么吗?
def _make_key(args, kwds, typed,
kwd_mark = (object(),),
fasttypes = {int, str, frozenset, type(None)},
sorted=sorted, tuple=tuple, type=type, len=len):
'Make a cache key from optionally typed positional and keyword arguments'
key = args
if kwds:
sorted_items = sorted(kwds.items())
key += kwd_mark
for item in sorted_items:
key += item
if typed:
key += tuple(type(v) for v in args)
if kwds:
key += tuple(type(v) for k, v in sorted_items)
elif len(key) == 1 and type(key[0]) in fasttypes:
return key[0]
return _HashedSeq(key)
该函数将一组函数参数转换为一个序列,如果一个函数使用相同的参数被多次调用,则该序列(a)可以被哈希处理,(b)对于相同的参数返回相同的哈希值。在
显然,}是泛型函数定义的位置参数和关键字参数:
args
和{args
是一个列表,只要它的所有元素都是散列的,kwargs
是一个dict
,它不是散列类型。因此,该函数使用.items()
将其转换为键值对列表;然后对其进行排序,因为列表的哈希值对元素的顺序敏感,dict
可以任意顺序列出其项。在kwd_mark
的目的是确保关键字参数不能与位置参数混淆,位置参数可能恰好与kwargs
的项由相同的键值对组成。作为默认参数,它的值在定义函数时被赋值;这保证了它的sentinel对象永远不会作为函数参数出现。在相关问题 更多 >
编程相关推荐