code
--- 直譯器基類¶
原始碼:Lib/code.py
code
模組提供了在 Python 中實現讀取-求值-列印迴圈(read-eval-print loop)的功能。其中包含兩個類和一些便捷函式,可用於構建提供互動式直譯器提示符的應用程式。
- class code.InteractiveInterpreter(locals=None)¶
此類處理解析和直譯器狀態(使用者的名稱空間);它不處理輸入緩衝、提示符或輸入檔名(檔名總是顯式傳入)。可選的 locals 引數指定了一個對映,用作程式碼執行的名稱空間;它預設為一個新建立的字典,其中鍵
'__name__'
的值設為'__console__'
,鍵'__doc__'
的值設為None
。請注意,在
InteractiveInterpreter
例項下建立的函式和類物件將屬於 locals 指定的名稱空間。只有當 locals 是現有模組的名稱空間時,它們才是可序列化 (pickleable) 的。
- class code.InteractiveConsole(locals=None, filename='<console>', local_exit=False)¶
緊密地模擬互動式 Python 直譯器的行為。這個類建立在
InteractiveInterpreter
之上,並增加了使用熟悉的sys.ps1
和sys.ps2
的提示功能以及輸入緩衝。如果 local_exit 為真,在控制檯中呼叫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()
方法會被呼叫,並將 banner 和 exitmsg 分別作為橫幅和退出訊息(如果提供的話)傳入。控制檯物件在使用後會被丟棄。在 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
;如果命令包含無效的字面值,則引發OverflowError
或ValueError
。
互動式直譯器物件¶
- InteractiveInterpreter.runsource(source, filename='<input>', symbol='single')¶
在直譯器中編譯並執行一些原始碼。引數與
compile_command()
的相同;filename 的預設值為'<input>'
,symbol 的預設值為'single'
。可能發生以下幾種情況:輸入不正確;
compile_command()
引發了一個異常(SyntaxError
或OverflowError
)。將透過呼叫showsyntaxerror()
方法列印語法回溯。runsource()
返回False
。輸入不完整,需要更多輸入;
compile_command()
返回了None
。runsource()
返回True
。輸入是完整的;
compile_command()
返回了一個程式碼物件。程式碼透過呼叫runcode()
執行(該方法也處理執行時異常,除了SystemExit
)。runsource()
返回False
。
返回值可用於決定下一行提示是使用
sys.ps1
還是sys.ps2
。
- InteractiveInterpreter.runcode(code)¶
執行一個程式碼物件。當發生異常時,會呼叫
showtraceback()
來顯示回溯資訊。除了SystemExit
之外,所有異常都會被捕獲,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
;如果該行已以某種方式處理,則返回False
(這與runsource()
相同)。
- InteractiveConsole.resetbuffer()¶
從輸入緩衝區中移除任何未處理的原始碼文字。