繁体   English   中英

为什么行缓存检查缓存中元组元素的长度?

[英]Why does linecache check for the length of the tuple elements in the cache?

https://github.com/python/cpython/blob/3.6/Lib/linecache.py中 ,有3个实例

getines

def getlines(filename, module_globals=None):
    if filename in cache:
        entry = cache[filename]
        if len(entry) != 1:
            return cache[filename][2]

updatecache

def updatecache(filename, module_globals=None):
    if filename in cache:
        if len(cache[filename]) != 1:
            del cache[filename]

lazycache

def lazycache(filename, module_globals):
    if filename in cache:
        if len(cache[filename]) == 1:
            return True
        else:
            return False

我正在编写自己的linecache版本并为其编写测试,我需要了解元组长度可以为1的情况

在一种情况下,将执行getlines中的语句。 这是第一次访问文件并将其存储在缓存中,然后在第二次访问之前将其删除。 但是我仍然无法弄清楚为什么其他两个函数中存在它。

如果有人可以帮助我了解使用此长度检查的目的,那将非常有帮助。

查看代码将值存储在缓存中的位置。 它可以在cache[filename]下存储两种不同的值:

  • 大小,调制时间,行列表和名称( 此处此处 )的4元组。
  • 一个函数的1元组,根据需要返回一个行列表( 此处 )。

1元组用于设置模块的延迟加载。 普通文件要懒加载,只需openread 但是模块源可能可以从模块的加载器(通过导入系统找到)获得,但不能仅通过打开和读取文件(例如zipimport模块)获得。 因此, lazycache必须lazycache加载程序的get_source方法,因此,如果以后需要这些行,则可以获取它们。

这意味着,无论何时使用这些缓存值,都必须检查其存储的种类并做不同的事情。 如果它现在需要行,并且有一个懒惰的1元组,则必须去加载这些行(通过updatecache ;如果它正在检查缓存逐出,并且发现一个从未被评估过的懒惰的元组,则将其删除;等等。

还要注意,在updatecache ,如果它是从惰性1元组加载文件的,则没有checkcache时间,这意味着在checkcache ,它无法检查文件是否过时。 但这对模块源来说很好-即使更改文件,旧版本仍然是import和使用的版本。


如果您是从头开始设计此程序,而不是黑客入侵自1.x早期黑暗时代以来stdlib中存在的内容,那么您可能会设计出完全不同的方法。 例如,您可以使用一个类,也可以使用两个实现相同接口的类。

另外,请注意,行linecache中的大量代码可以用来处理与加载模块源代码有关的特殊情况,除非您试图构建可反映Python代码的内容(如traceback那样),否则不需要任何。 (即使你正在做的,你可能要使用的inspect模块而不是直接谈话的导入系统。)

因此, linecache可能不是基于您自己的行缓存的最佳示例代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM