code — 直譯器基類

原始碼: Lib/code.py


code 模組提供了在 Python 中實現讀取-求值-列印迴圈的工具。其中包含兩個類和便捷函式,可用於構建提供互動式直譯器提示的應用程式。

class code.InteractiveInterpreter(locals=None)

此類處理解析和直譯器狀態(使用者的名稱空間);它不處理輸入緩衝、提示或輸入檔案命名(檔名始終顯式傳入)。可選的 locals 引數指定一個對映,用作程式碼執行的名稱空間;它預設為一個新建立的字典,其鍵 '__name__' 設定為 '__console__',鍵 '__doc__' 設定為 None

class code.InteractiveConsole(locals=None, filename='<console>', local_exit=False)

緊密模擬互動式 Python 直譯器的行為。此類構建於 InteractiveInterpreter 之上,並添加了使用熟悉的 sys.ps1sys.ps2 進行提示和輸入緩衝的功能。如果 local_exit 為 true,則控制檯中的 exit()quit() 不會引發 SystemExit,而是返回到呼叫程式碼。

在 3.13 版本中更改: 添加了 local_exit 引數。

code.interact(banner=None, readfunc=None, local=None, exitmsg=None, local_exit=False)

執行讀取-求值-列印迴圈的便捷函式。這將建立一個新的 InteractiveConsole 例項,並將 readfunc 設定為用作 InteractiveConsole.raw_input() 方法(如果提供)。如果提供了 local,則將其傳遞給 InteractiveConsole 建構函式,以用作直譯器迴圈的預設名稱空間。如果提供了 local_exit,則將其傳遞給 InteractiveConsole 建構函式。然後,例項的 interact() 方法會執行,並將 bannerexitmsg 作為要使用的橫幅和退出訊息傳遞(如果提供)。控制檯物件在使用後會被丟棄。

在 3.6 版本中更改: 添加了 exitmsg 引數。

在 3.13 版本中更改: 添加了 local_exit 引數。

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

此函式對於想要模擬 Python 直譯器主迴圈(又稱讀取-求值-列印迴圈)的程式很有用。棘手的部分是確定使用者何時輸入了可透過輸入更多文字完成的不完整命令(而不是完整命令或語法錯誤)。此函式幾乎總是做出與實際直譯器主迴圈相同的決定。

source 是源字串;filename 是從中讀取源的可選檔名,預設為 '<input>'symbol 是可選的語法起始符號,應為 'single' (預設值)、 'eval''exec'

如果命令完整且有效,則返回一個程式碼物件(與 compile(source, filename, symbol) 相同);如果命令不完整,則返回 None;如果命令完整且包含語法錯誤,則引發 SyntaxError,如果命令包含無效文字,則引發 OverflowErrorValueError

互動式直譯器物件

InteractiveInterpreter.runsource(source, filename='<input>', symbol='single')

在直譯器中編譯並執行一些原始碼。引數與 compile_command() 相同;filename 的預設值為 '<input>'symbol 的預設值為 'single'。可能會發生以下幾種情況之一:

返回值可用於決定是使用 sys.ps1 還是 sys.ps2 來提示下一行。

InteractiveInterpreter.runcode(code)

執行程式碼物件。當發生異常時,將呼叫 showtraceback() 來顯示回溯資訊。捕獲所有異常,除了 SystemExit,該異常允許傳播。

關於 KeyboardInterrupt 的說明:此異常可能在此程式碼的其他地方發生,並且可能並不總是被捕獲。呼叫者應準備好處理它。

InteractiveInterpreter.showsyntaxerror(filename=None)

顯示剛剛發生的語法錯誤。這不會顯示堆疊跟蹤,因為語法錯誤沒有堆疊跟蹤。如果給定了 *filename*,它會被放入異常中,而不是 Python 解析器提供的預設檔名,因為它在從字串讀取時始終使用 '<string>'。輸出由 write() 方法寫入。

InteractiveInterpreter.showtraceback()

顯示剛剛發生的異常。我們刪除了第一個堆疊項,因為它位於直譯器物件的實現中。輸出由 write() 方法寫入。

在 3.5 版本中變更: 顯示完整的鏈式回溯,而不僅僅是主回溯。

InteractiveInterpreter.write(data)

將字串寫入標準錯誤流(sys.stderr)。派生類應該覆蓋此方法,以根據需要提供適當的輸出處理。

互動式控制檯物件

InteractiveConsole 類是 InteractiveInterpreter 的子類,因此除了以下新增內容外,還提供瞭解釋器物件的所有方法。

InteractiveConsole.interact(banner=None, exitmsg=None)

緊密地模擬互動式 Python 控制檯。可選的 *banner* 引數指定在第一次互動之前列印的橫幅;預設情況下,它會列印一個類似於標準 Python 直譯器列印的橫幅,後面跟著控制檯物件的類名(用括號括起來,以便不將其與真正的直譯器混淆 - 因為它非常接近!)。

可選的 *exitmsg* 引數指定退出時列印的退出訊息。傳遞空字串以抑制退出訊息。如果未給定 *exitmsg* 或 None,則會列印預設訊息。

在 3.4 版本中變更: 要禁止列印任何橫幅,請傳遞空字串。

在 3.6 版本中變更: 退出時列印退出訊息。

InteractiveConsole.push(line)

將一行原始碼推送到直譯器。該行不應包含尾隨換行符;它可以包含內部換行符。該行被附加到一個緩衝區中,並使用緩衝區的連線內容作為源呼叫直譯器的 runsource() 方法。如果這表明命令已執行或無效,則重置緩衝區;否則,命令未完成,並且緩衝區保留在附加該行後的狀態。如果需要更多輸入,則返回值為 True,如果該行以某種方式處理了(這與 runsource() 相同),則返回值為 False

InteractiveConsole.resetbuffer()

從輸入緩衝區中刪除任何未處理的原始碼文字。

InteractiveConsole.raw_input(prompt='')

寫入提示並讀取一行。返回的行不包含尾隨換行符。當用戶輸入 EOF 鍵序列時,會引發 EOFError。基本實現從 sys.stdin 讀取;子類可以用不同的實現替換它。