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'
)或作為表示式('eval'
)。任何其他值都會導致ValueError
被引發。注意
解析器有可能(但不太可能)在到達源的末尾之前就成功地停止解析;在這種情況下,可能會忽略尾隨符號,而不是導致錯誤。 例如,反斜槓後跟兩個換行符後可以跟任意垃圾。 一旦解析器的 API 得到改進,這將得到修復。
- class codeop.Compile¶
此類的例項具有與內建函式
compile()
簽名相同的__call__()
方法,但不同之處在於,如果例項編譯包含__future__
語句的程式文字,則該例項會“記住”並強制使用該語句編譯所有後續的程式文字。
- class codeop.CommandCompiler¶
此類的例項具有與
compile_command()
簽名相同的__call__()
方法;不同之處在於,如果例項編譯包含__future__
語句的程式文字,則該例項會“記住”並強制使用該語句編譯所有後續程式文字。