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