codeop — 編譯 Python 程式碼

原始碼: Lib/codeop.py


codeop 模組提供了一些實用工具,可以用來模擬 Python 的讀取-求值-列印迴圈,就像在 code 模組中所做的那樣。 因此,您可能不想直接使用該模組;如果您想在程式中包含這樣的迴圈,您可能需要使用 code 模組代替。

這項工作分為兩部分

  1. 能夠判斷一行輸入是否完成一個 Python 語句:簡而言之,判斷接下來是列印 ‘>>>’ 還是 ‘...’。

  2. 記住使用者已輸入的哪些 future 語句,以便可以使用這些語句來編譯後續輸入。

codeop 模組提供了一種執行這些操作的方法,以及一種同時執行它們的方法。

要僅執行前者

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

嘗試編譯 source,它應該是一個 Python 程式碼字串,如果 source 是有效的 Python 程式碼,則返回一個程式碼物件。 在這種情況下,程式碼物件的 filename 屬性將是 filename,預設為 '<input>'。 如果 source 不是有效的 Python 程式碼,但卻是有效 Python 程式碼的字首,則返回 None

如果 source 存在問題,則會引發異常。 如果存在無效的 Python 語法,則會引發 SyntaxError,如果存在無效的字面量,則會引發 OverflowErrorValueError

symbol 引數確定 source 是編譯為語句('single',預設值),還是作為語句序列('exec')或作為表示式'eval')。任何其他值都會導致 ValueError 被引發。

注意

解析器有可能(但不太可能)在到達源的末尾之前就成功地停止解析;在這種情況下,可能會忽略尾隨符號,而不是導致錯誤。 例如,反斜槓後跟兩個換行符後可以跟任意垃圾。 一旦解析器的 API 得到改進,這將得到修復。

class codeop.Compile

此類的例項具有與內建函式 compile() 簽名相同的 __call__() 方法,但不同之處在於,如果例項編譯包含 __future__ 語句的程式文字,則該例項會“記住”並強制使用該語句編譯所有後續的程式文字。

class codeop.CommandCompiler

此類的例項具有與 compile_command() 簽名相同的 __call__() 方法;不同之處在於,如果例項編譯包含 __future__ 語句的程式文字,則該例項會“記住”並強制使用該語句編譯所有後續程式文字。