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