_Python的LRU缓存cod中的make_key函数

2024-09-29 17:17:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在研究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)

Tags: keyinformakeleniftypeargs
1条回答
网友
1楼 · 发布于 2024-09-29 17:17:27

该函数将一组函数参数转换为一个序列,如果一个函数使用相同的参数被多次调用,则该序列(a)可以被哈希处理,(b)对于相同的参数返回相同的哈希值。在

显然,args和{}是泛型函数定义的位置参数和关键字参数:

def foo(*args, **kwargs):
    pass

args是一个列表,只要它的所有元素都是散列的,kwargs是一个dict,它不是散列类型。因此,该函数使用.items()将其转换为键值对列表;然后对其进行排序,因为列表的哈希值对元素的顺序敏感,dict可以任意顺序列出其项。在

kwd_mark的目的是确保关键字参数不能与位置参数混淆,位置参数可能恰好与kwargs的项由相同的键值对组成。作为默认参数,它的值在定义函数时被赋值;这保证了它的sentinel对象永远不会作为函数参数出现。在

相关问题 更多 >

    热门问题