codeop --- 編譯Python代碼?
源代碼: Lib/codeop.py
codeop 模塊提供了可以模擬Python讀取-執行-打印循環的實用程序,就像在 code 模塊中一樣。因此,您可能不希望直接使用該模塊;如果你想在程序中包含這樣一個循環,你可能需要使用 code 模塊。
這個任務有兩個部分:
能夠判斷一行輸入是否完成了一個Python語句:簡而言之,告訴我們是否要打印 '
>>>' 或 '...'。記住用戶已輸入了哪些 future 語句,這樣后續的輸入可以在這些語句被啟用的狀態下被編譯。
codeop 模塊提供了分別以及同時執行這兩個部分的方式。
只執行前一部分:
-
codeop.compile_command(source, filename="<input>", symbol="single")? 嘗試編譯 source,這應當是一個 Python 代碼字符串,并且在 source 是有效的 Python 代碼時返回一個代碼對象。 在此情況下,代碼對象的 filename 屬性將為 filename,其默認值為
'<input>'。 如果 source 不是 有效的 Python 代碼而是有效的 Python 代碼的一個前綴時將返回None。如果 source 存在問題,將引發異常。 如果存在無效的 Python 語法將引發
SyntaxError,而如果存在無效的字面值則將引發OverflowError或ValueError。symbol 參數確定 source 是作為一條語句 (對應默認值
'single'),作為一系列語句 ('exec') 還是作為一個 expression ('eval') 進行編譯。 任何其他值都將導致引發ValueError。注解
解析器有可能(但很不常見)會在到達源碼結尾之前停止解析并成功輸出結果;在這種情況下,末尾的符號可能會被忽略而不是引發錯誤。 例如,一個反斜杠加兩個換行符之后可以跟隨任何無意義的符號。 一旦解析器 API 得到改進將修正這個問題。
-
class
codeop.Compile? 這個類的實例具有
__call__()方法,其簽名與內置函數compile()相似,區別在于如果該實例編譯了包含__future__語句的程序文本,則實例會‘記住’并使用已生效的語句編譯所有后續程序文本。
-
class
codeop.CommandCompiler? 這個類的實例具有
__call__()方法,其簽名與compile_command()相似;區別在于如果該實例編譯了包含__future__語句的程序文本,則實例會‘記住’并使用已生效的語句編譯編譯所有后續程序文本。
