code
--- 解釋器基類?
源代碼: Lib/code.py
code
模塊提供了在 Python 中實(shí)現(xiàn) read-eval-print 循環(huán)的功能。它包含兩個(gè)類和一些快捷功能,可用于構(gòu)建提供交互式解釋器的應(yīng)用程序。
- class code.InteractiveInterpreter(locals=None)?
這個(gè)類處理解析器和解釋器狀態(tài)(用戶命名空間的);它不處理緩沖器、終端提示區(qū)或著輸入文件名(文件名總是顯示地傳遞)??蛇x的 locals 參數(shù)指定一個(gè)字典,字典里面包含將在此類執(zhí)行的代碼;它默認(rèn)創(chuàng)建新的字典,其鍵
'__name__'
設(shè)置為'__console__'
,鍵'__doc__'
設(shè)置為None
。
- class code.InteractiveConsole(locals=None, filename='<console>')?
盡可能模擬交互式 Python 解釋器的行為。此類建立在
InteractiveInterpreter
的基礎(chǔ)上,使用熟悉的sys.ps1
和sys.ps2
作為輸入提示符,并有輸入緩沖。
- code.interact(banner=None, readfunc=None, local=None, exitmsg=None)?
運(yùn)行一個(gè) read-eval-print 循環(huán)的便捷函數(shù)。這會(huì)創(chuàng)建一個(gè)新的
InteractiveConsole
實(shí)例。如果提供了 readfunc ,會(huì)設(shè)置為InteractiveConsole.raw_input()
方法。如果提供了 local ,則將其傳遞給InteractiveConsole
的構(gòu)造函數(shù),以用作解釋器循環(huán)的默認(rèn)命名空間。然后,如果提供了 banner 和 exitmsg ,實(shí)例的interact()
方法會(huì)以此為標(biāo)題和退出消息??刂婆_(tái)對(duì)象在使用后將被丟棄。在 3.6 版更改: 加入 exitmsg 參數(shù)。
- code.compile_command(source, filename='<input>', symbol='single')?
這個(gè)函數(shù)主要用來模擬 Python 解釋器的主循環(huán)(即 read-eval-print 循環(huán))。難點(diǎn)的部分是當(dāng)用戶輸入不完整命令時(shí),判斷能否通過之后的輸入來完成(要么成為完整的命令,要么語法錯(cuò)誤)。該函數(shù) 幾乎 和實(shí)際的解釋器主循環(huán)的判斷是相同的。
source 是源字符串;filename 是可選的用作讀取源的文件名,默認(rèn)為
'<input>'
;symbol 是可選的語法開啟符號(hào),應(yīng)為'single'
(默認(rèn)),'eval'
或'exec'
。如果命令完整且有效則返回一個(gè)代碼對(duì)象 (等價(jià)于
compile(source, filename, symbol)
);如果命令不完整則返回None
;如果命令完整但包含語法錯(cuò)誤則會(huì)引發(fā)SyntaxError
或OverflowError
而如果命令包含無效字面值則將引發(fā)ValueError
。
交互解釋器對(duì)象?
- InteractiveInterpreter.runsource(source, filename='<input>', symbol='single')?
在解釋器中編譯并運(yùn)行一段源碼。 所用參數(shù)與
compile_command()
一樣;filename 的默認(rèn)值為'<input>'
,symbol 則為'single'
。 可能發(fā)生以下情況之一:輸入不正確;
compile_command()
引發(fā)了一個(gè)異常 (SyntaxError
或OverflowError
)。 將通過調(diào)用showsyntaxerror()
方法打印語法回溯信息。runsource()
返回False
。輸入不完整,需要更多輸入;函數(shù)
compile_command()
返回None
。方法runsource()
返回True
。輸入完整;
compile_command()
返回了一個(gè)代碼對(duì)象。 將通過調(diào)用runcode()
執(zhí)行代碼(該方法也會(huì)處理運(yùn)行時(shí)異常,SystemExit
除外)。runsource()
返回False
。
該返回值用于決定使用
sys.ps1
還是sys.ps2
來作為下一行的輸入提示符。
- InteractiveInterpreter.runcode(code)?
執(zhí)行一個(gè)代碼對(duì)象。當(dāng)發(fā)生異常時(shí),調(diào)用
showtraceback()
來顯示回溯。除SystemExit
(允許傳播)以外的所有異常都會(huì)被捕獲。有關(guān)
KeyboardInterrupt
的說明,該異??赡馨l(fā)生于此代碼的其他位置,并且并不總能被捕獲。 調(diào)用者應(yīng)當(dāng)準(zhǔn)備好處理它。
- InteractiveInterpreter.showsyntaxerror(filename=None)?
顯示剛發(fā)生的語法錯(cuò)誤。 這不會(huì)顯示堆?;厮菀?yàn)檎Z法錯(cuò)誤并無此種信息。 如果給出了 filename,它會(huì)被放入異常來替代 Python 解析器所提供的默認(rèn)文件名,因?yàn)樗趶囊粋€(gè)字符串讀取時(shí)總是會(huì)使用
'<string>'
。 輸出將由write()
方法來寫入。
- InteractiveInterpreter.showtraceback()?
顯示剛發(fā)生的異常。 我們移除了第一個(gè)堆棧條目因?yàn)樗鼜膶儆诮忉屍鲗?duì)象的實(shí)現(xiàn)。 輸出將由
write()
方法來寫入。在 3.5 版更改: 將顯示完整的鏈?zhǔn)交厮荩恢皇侵骰厮荨?/p>
- InteractiveInterpreter.write(data)?
將一個(gè)字符串寫入到標(biāo)準(zhǔn)錯(cuò)誤流 (
sys.stderr
)。 所有派生類都應(yīng)重載此方法以提供必要的正確輸出處理。
交互式控制臺(tái)對(duì)象?
InteractiveConsole
類是 InteractiveInterpreter
的子類,因此它提供了解釋器對(duì)象的所有方法,還有以下的額外方法。
- InteractiveConsole.interact(banner=None, exitmsg=None)?
近似地模擬交互式 Python 終端。 可選的 banner 參數(shù)指定要在第一次交互前打印的條幅;默認(rèn)情況下會(huì)類似于標(biāo)準(zhǔn) Python 解釋器所打印的內(nèi)容,并附上外加圓括號(hào)的終端對(duì)象類名(這樣就不會(huì)與真正的解釋器混淆 —— 因?yàn)榇_實(shí)太像了!)
可選的 exitmsg 參數(shù)指定要在退出時(shí)打印的退出消息。 傳入空字符串可以屏蔽退出消息。 如果 exitmsg 未給出或?yàn)?
None
,則將打印默認(rèn)消息。在 3.4 版更改: 要禁止打印任何條幅消息,請(qǐng)傳遞一個(gè)空字符串。
在 3.6 版更改: 退出時(shí)打印退出消息。
- InteractiveConsole.push(line)?
將一行源文本推入解釋器。 行內(nèi)容不應(yīng)帶有末尾換行符;它可以有內(nèi)部換行符。 行內(nèi)容會(huì)被添加到一個(gè)緩沖區(qū)并且會(huì)調(diào)用解釋器的
runsource()
方法,附帶緩沖區(qū)內(nèi)容的拼接結(jié)果作為源文本。 如果顯示命令已執(zhí)行或不合法,緩沖區(qū)將被重置;否則,則命令尚未結(jié)束,緩沖區(qū)將在添加行后保持原樣。 如果要求更多輸入則返回值為True
,如果行已按某種方式被處理則返回值為False
(這與runsource()
相同)。
- InteractiveConsole.resetbuffer()?
從輸入緩沖區(qū)中刪除所有未處理的內(nèi)容。