codeop --- 編譯 Python 程式碼

原始碼:Lib/codeop.py


codeop 模組提供了可以模擬 Python read-eval-print 循環的工具程式 (utilities),就像在 code 模組中所做的那樣。因此你可能不想直接使用該模組;如果你想在程式中包含這樣的循環,你可能需要使用 code 模組。

這個任務有兩個部分:

  1. 能夠判斷一列輸入是否完成了一項 Python 陳述式:簡而言之,判斷接下來是列印 '>>>' 還是 '...'。

  2. 記住使用者輸入了哪些未來陳述式,以便後續輸入可以在這些陳述式生效的情況下進行編譯。

codeop 模組提供了一種完成上述每項任務的方法,以及同時完成這兩項任務的方法。

只做前者:

codeop.compile_command(source, filename='<input>', symbol='single')

嘗試編譯 source,它應該是 Python 程式碼的字串,如果 source 是有效的 Python 程式碼,則回傳一個程式碼物件 (code object)。在這種情況下,程式碼物件的檔案名稱屬性將為 filename,預設為 '<input>'。如果 source 不是有效的 Python 程式碼,而是有效 Python 程式碼的前綴,則回傳 None

如果 source 有問題,就會引發例外。如果存在無效的 Python 語法則會引發 SyntaxError;如果存在無效的文字 (literal),則會引發 OverflowErrorValueError

symbol 引數決定 source 是否編譯為陳述式('single',為預設值)、為陳述式序列 ('exec') 或為運算式 ('eval')。任何其他值都會導致引發 ValueError

備註

剖析器 (parser) 有可能(但通常不會)在到達原始碼的結尾之前停止剖析並獲得成功的結果;在這種情況下,尾隨符號可能會被忽略而不是導致錯誤。例如,反斜線後面加上兩個換行符號後可以是任意的無意義符號。這個問題在未來會因為剖析器 API 的改善而被解決。

class codeop.Compile

此類別的實例具有 __call__() 方法,其簽名與內建函式 compile() 相同,區別在於如果實例編譯包含 __future__ 陳述式的程式文本,實例會「記住」並使用該陳述式開始編譯所有後續程式文本。

class codeop.CommandCompiler

此類別的實例具有 __call__() 方法,其簽名與內建函式 compile_command() 相同,區別在於如果實例編譯包含 __future__ 陳述式的程式文本,實例會「記住」並使用該陳述式開始編譯所有後續程式文本。