codeop
--- 編譯 Python 程式碼¶
原始碼:Lib/codeop.py
codeop
模組提供了可以模擬 Python read-eval-print 循環的工具程式 (utilities),就像在 code
模組中所做的那樣。因此你可能不想直接使用該模組;如果你想在程式中包含這樣的循環,你可能需要使用 code
模組。
這個任務有兩個部分:
能夠判斷一列輸入是否完成了一項 Python 陳述式:簡而言之,判斷接下來是列印 '
>>>
' 還是 '...
'。記住使用者輸入了哪些未來陳述式,以便後續輸入可以在這些陳述式生效的情況下進行編譯。
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),則會引發OverflowError
或ValueError
。symbol 引數決定 source 是否編譯為陳述式(
'single'
,為預設值)、為陳述式序列 ('exec'
) 或為運算式 ('eval'
)。任何其他值都會導致引發ValueError
。備註
剖析器 (parser) 有可能(但通常不會)在到達原始碼的結尾之前停止剖析並獲得成功的結果;在這種情況下,尾隨符號可能會被忽略而不是導致錯誤。例如,反斜線後面加上兩個換行符號後可以是任意的無意義符號。這個問題在未來會因為剖析器 API 的改善而被解決。
- class codeop.Compile¶
此類別的實例具有
__call__()
方法,其簽名與內建函式compile()
相同,區別在於如果實例編譯包含__future__
陳述式的程式文本,實例會「記住」並使用該陳述式開始編譯所有後續程式文本。
- class codeop.CommandCompiler¶
此類別的實例具有
__call__()
方法,其簽名與內建函式compile_command()
相同,區別在於如果實例編譯包含__future__
陳述式的程式文本,實例會「記住」並使用該陳述式開始編譯所有後續程式文本。