linecache
— 文本行的随机访问¶
源代码: Lib/linecache.py
linecache
模块允许从任何 Python 源文件中获取任意行,同时尝试在内部使用缓存进行优化,以应对从单个文件读取多行的常见情况。 traceback
模块使用此功能来检索源代码行,以便将其包含在格式化的回溯信息中。
tokenize.open()
函数被用来打开文件。此函数使用 tokenize.detect_encoding()
来获取文件的编码;在没有编码令牌的情况下,文件编码默认为 UTF-8。
linecache
模块定义了以下函数:
- linecache.getline(filename, lineno, module_globals=None)¶
从名为 filename 的文件中获取第 lineno 行。这个函数永远不会引发异常 —— 它会在出错时返回
''
(对于找到的行,将包含末尾的换行符)。如果 filename 指向一个冻结模块(以
'<frozen '
开头),并且 module_globals 不为None
,该函数将尝试从module_globals['__file__']
获取真实的文件名。如果找不到名为 filename 的文件,该函数会先在 module_globals 中检查是否存在 PEP 302
__loader__
。如果存在这样的加载器并且它定义了get_source
方法,那么就由该方法来确定源码行(如果get_source()
返回None
,则返回''
)。最后,如果 filename 是一个相对文件名,它会相对于模块搜索路径sys.path
中的条目进行查找。在 3.14 版本发生变更: 支持冻结模块的 filename。
- linecache.checkcache(filename=None)¶
检查缓存的有效性。如果缓存中的文件可能在磁盘上发生了更改,而你需要更新后的版本,请使用此函数。如果省略 filename,它将检查缓存中的所有条目。
- linecache.lazycache(filename, module_globals)¶
捕获一个非文件模块的足够细节,以便后续通过
getline()
获取其代码行,即使在后续调用中 module_globals 为None
。这避免了在实际需要某一行之前执行 I/O 操作,也无需无限期地持有模块的全局变量。在 3.5 版本加入。
示例
>>> import linecache
>>> linecache.getline(linecache.__file__, 8)
'import sys\n'