codeop
--- 編譯 Python 程式碼¶
原始碼: Lib/codeop.py
codeop
模組提供了可用於模擬 Python 讀取-求值-列印 迴圈(REPL)的工具,就像 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¶
這個類的例項擁有
__call__()
方法,其簽名與內建函式compile()
相同,但不同之處在於,如果例項編譯了包含__future__
語句的程式文字,該例項會“記住”並在編譯所有後續程式文字時強制應用該語句。
- class codeop.CommandCompiler¶
這個類的例項擁有
__call__()
方法,其簽名與compile_command()
相同;不同之處在於,如果例項編譯了包含__future__
語句的程式文字,該例項會“記住”並在編譯所有後續程式文字時強制應用該語句。