9. 頂級(jí)組件?
Python 解釋器可以從多種源獲得輸入:作為標(biāo)準(zhǔn)輸入或程序參數(shù)傳入的腳本,以交互方式鍵入的語(yǔ)句,導(dǎo)入的模塊源文件等等。 這一章將給出在這些情況下所用的語(yǔ)法。
9.1. 完整的 Python 程序?
雖然語(yǔ)言規(guī)范描述不必規(guī)定如何發(fā)起調(diào)用語(yǔ)言解釋器,但對(duì)完整的 Python 程序加以說(shuō)明還是很有用的。 一個(gè)完整的 Python 程序會(huì)在最小初始化環(huán)境中被執(zhí)行:所有內(nèi)置和標(biāo)準(zhǔn)模塊均為可用,但均處于未初始化狀態(tài),只有 sys
(各種系統(tǒng)服務(wù)), builtins
(內(nèi)置函數(shù)、異常以及 None
) 和 __main__
除外。 最后一個(gè)模塊用于為完整程序的執(zhí)行提供局部和全局命名空間。
適用于一個(gè)完整 Python 程序的語(yǔ)法即下節(jié)所描述的文件輸入。
解釋器也可以通過(guò)交互模式被發(fā)起調(diào)用;在此情況下,它并不讀取和執(zhí)行一個(gè)完整程序,而是每次讀取和執(zhí)行一條語(yǔ)句(可能為復(fù)合語(yǔ)句)。 此時(shí)的初始環(huán)境與一個(gè)完整程序的相同;每條語(yǔ)句會(huì)在 __main__
的命名空間中被執(zhí)行。
一個(gè)完整程序可通過(guò)三種形式被傳遞給解釋器:使用 -c
字符串 命令行選項(xiàng),使用一個(gè)文件作為第一個(gè)命令行參數(shù),或者使用標(biāo)準(zhǔn)輸入。 如果文件或標(biāo)準(zhǔn)輸入是一個(gè) tty 設(shè)置,解釋器會(huì)進(jìn)入交互模式;否則的話,它會(huì)將文件當(dāng)作一個(gè)完整程序來(lái)執(zhí)行。
9.2. 文件輸入?
所有從非交互式文件讀取的輸入都具有相同的形式:
file_input ::= (NEWLINE | statement
)*
此語(yǔ)法用于下列幾種情況:
解析一個(gè)完整 Python 程序時(shí)(從文件或字符串);
解析一個(gè)模塊時(shí);
解析一個(gè)傳遞給
exec()
函數(shù)的字符串時(shí);
9.3. 交互式輸入?
交互模式下的輸入使用以下語(yǔ)法進(jìn)行解析:
interactive_input ::= [stmt_list
] NEWLINE |compound_stmt
NEWLINE
請(qǐng)注意在交互模式下一條(最高層級(jí))復(fù)合語(yǔ)句必須帶有一個(gè)空行;這對(duì)于幫助解析器確定輸入的結(jié)束是必須的。
9.4. 表達(dá)式輸入?
eval()
被用于表達(dá)式輸入。 它會(huì)忽略開頭的空白。 傳遞給 eval()
的字符串參數(shù)必須具有以下形式:
eval_input ::= expression_list
NEWLINE*