【问题标题】:_make_key function in Python's LRU cache codePython 的 LRU 缓存代码中的 _make_key 函数
【发布时间】:2015-08-18 19:02:02
【问题描述】:

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

【问题讨论】:

  • 喜欢....整个功能?你能缩小你的问题范围吗?有没有你不明白的特定行?
  • 一种完整的功能。 sort在这里的作用是什么? kwd_mark 是什么?

标签: python lru


【解决方案1】:

该函数正在将一组函数参数转换为一个序列,该序列 (a) 可以进行散列处理,并且 (b) 如果使用相同的参数多次调用函数,则为相同的参数返回相同的散列值。

显然,argskwargs 旨在作为通用函数定义的位置和关键字参数:

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

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

kwd_mark 的目的是确保关键字参数不会与可能碰巧包含与 kwargs 的项目相同的键值对的位置参数混淆。作为默认参数,它的值是在定义函数时分配的;这保证了它的哨兵对象永远不会作为函数参数出现。

【讨论】:

    【解决方案2】:

    总结

    _make_key() 函数将参数扁平化为一个紧凑的元组,可用于确定两个调用的参数是否相同。

    生成的密钥

    调用f(10, 20, x=30, y=40)f(10, 20, y=40, x=30) 都具有相同的密钥:

    (10, 20, <object object at 0x7fae2bb25040>, 'x', 30, 'y', 40)
    

    1020 位置参数按指定顺序记录。

    kwd_mark 将关键字参数与位置参数分开。

    对关键字参数进行排序,以便将x=30, y=40 识别为与y=40, x=30 相同。

    如果typed为真,那么key也记录参数类型:

    (10, 20,                            # positional args
    <object object at 0x7fae2bb25040>,  # kwd_mark
    'x', 30, 'y', 40,                   # keyword args
    <class 'int'>, <class 'int'>,       # types of the args  
    <class 'int'>, <class 'int'>)
    

    【讨论】:

      猜你喜欢
      • 2014-06-22
      • 2011-05-25
      • 2013-08-02
      • 2011-03-02
      • 2017-12-31
      • 1970-01-01
      • 1970-01-01
      • 2010-11-03
      • 2015-07-19
      相关资源
      最近更新 更多