codeop --- 編譯Python代碼?

源代碼: Lib/codeop.py


codeop 模塊提供了可以模擬Python讀取-執(zhí)行-打印循環(huán)的實(shí)用程序,就像在 code 模塊中一樣。因此,您可能不希望直接使用該模塊;如果你想在程序中包含這樣一個(gè)循環(huán),你可能需要使用 code 模塊。

這個(gè)任務(wù)有兩個(gè)部分:

  1. 能夠判斷一行輸入是否完成了一個(gè)Python語句:簡(jiǎn)而言之,告訴我們是否要打印 '>>>' 或 '...'。

  2. 記住用戶已輸入了哪些 future 語句,這樣后續(xù)的輸入可以在這些語句被啟用的狀態(tài)下被編譯。

codeop 模塊提供了分別以及同時(shí)執(zhí)行這兩個(gè)部分的方式。

只執(zhí)行前一部分:

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

嘗試編譯 source,這應(yīng)當(dāng)是一個(gè) Python 代碼字符串,并且在 source 是有效的 Python 代碼時(shí)返回一個(gè)代碼對(duì)象。 在此情況下,代碼對(duì)象的 filename 屬性將為 filename,其默認(rèn)值為 '<input>'。 如果 source 不是 有效的 Python 代碼而是有效的 Python 代碼的一個(gè)前綴時(shí)將返回 None。

如果 source 存在問題,將引發(fā)異常。 如果存在無效的 Python 語法將引發(fā) SyntaxError,而如果存在無效的字面值則將引發(fā) OverflowErrorValueError。

symbol 參數(shù)確定 source 是作為一條語句 (對(duì)應(yīng)默認(rèn)值 'single'),作為一系列語句 ('exec') 還是作為一個(gè) expression ('eval') 進(jìn)行編譯。 任何其他值都將導(dǎo)致引發(fā) ValueError。

備注

解析器有可能(但很不常見)會(huì)在到達(dá)源碼結(jié)尾之前停止解析并成功輸出結(jié)果;在這種情況下,末尾的符號(hào)可能會(huì)被忽略而不是引發(fā)錯(cuò)誤。 例如,一個(gè)反斜杠加兩個(gè)換行符之后可以跟隨任何無意義的符號(hào)。 一旦解析器 API 得到改進(jìn)將修正這個(gè)問題。

class codeop.Compile?

這個(gè)類的實(shí)例具有 __call__() 方法,其簽名與內(nèi)置函數(shù) compile() 相似,區(qū)別在于如果該實(shí)例編譯了包含 __future__ 語句的程序文本,則實(shí)例會(huì)‘記住’并使用已生效的語句編譯所有后續(xù)程序文本。

class codeop.CommandCompiler?

這個(gè)類的實(shí)例具有 __call__() 方法,其簽名與 compile_command() 相似;區(qū)別在于如果該實(shí)例編譯了包含 __future__ 語句的程序文本,則實(shí)例會(huì)‘記住’并使用已生效的語句編譯編譯所有后續(xù)程序文本。