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.clearcache()

清除快取。如果你不再需要之前使用 getline() 讀取的檔案的行,請使用此函式。

linecache.checkcache(filename=None)

檢查快取的有效性。如果快取中的檔案可能在磁碟上發生了更改,而你需要更新後的版本,請使用此函式。如果省略 filename,它將檢查快取中的所有條目。

linecache.lazycache(filename, module_globals)

捕獲一個非檔案模組的足夠細節,以便後續透過 getline() 獲取其程式碼行,即使在後續呼叫中 module_globalsNone。這避免了在實際需要某一行之前執行 I/O 操作,也無需無限期地持有模組的全域性變數。

在 3.5 版本加入。

示例

>>> import linecache
>>> linecache.getline(linecache.__file__, 8)
'import sys\n'