[英]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]
下存储两种不同的值:
1元组用于设置模块的延迟加载。 普通文件要懒加载,只需open
并read
。 但是模块源可能可以从模块的加载器(通过导入系统找到)获得,但不能仅通过打开和读取文件(例如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.