9. 頂級組件?

Python 解釋器可以從多種源獲得輸入:作為標(biāo)準(zhǔn)輸入或程序參數(shù)傳入的腳本,以交互方式鍵入的語句,導(dǎo)入的模塊源文件等等。 這一章將給出在這些情況下所用的語法。

9.1. 完整的 Python 程序?

雖然語言規(guī)范描述不必規(guī)定如何發(fā)起調(diào)用語言解釋器,但對完整的 Python 程序加以說明還是很有用的。 一個完整的 Python 程序會在最小初始化環(huán)境中被執(zhí)行:所有內(nèi)置和標(biāo)準(zhǔn)模塊均為可用,但均處于未初始化狀態(tài),只有 sys (各種系統(tǒng)服務(wù)), builtins (內(nèi)置函數(shù)、異常以及 None) 和 __main__ 除外。 最后一個模塊用于為完整程序的執(zhí)行提供局部和全局命名空間。

適用于一個完整 Python 程序的語法即下節(jié)所描述的文件輸入。

解釋器也可以通過交互模式被發(fā)起調(diào)用;在此情況下,它并不讀取和執(zhí)行一個完整程序,而是每次讀取和執(zhí)行一條語句(可能為復(fù)合語句)。 此時的初始環(huán)境與一個完整程序的相同;每條語句會在 __main__ 的命名空間中被執(zhí)行。

一個完整程序可通過三種形式被傳遞給解釋器:使用 -c 字符串 命令行選項(xiàng),使用一個文件作為第一個命令行參數(shù),或者使用標(biāo)準(zhǔn)輸入。 如果文件或標(biāo)準(zhǔn)輸入是一個 tty 設(shè)置,解釋器會進(jìn)入交互模式;否則的話,它會將文件當(dāng)作一個完整程序來執(zhí)行。

9.2. 文件輸入?

所有從非交互式文件讀取的輸入都具有相同的形式:

file_input ::=  (NEWLINE | statement)*

此語法用于下列幾種情況:

  • 解析一個完整 Python 程序時(從文件或字符串);

  • 解析一個模塊時;

  • 解析一個傳遞給 exec() 函數(shù)的字符串時;

9.3. 交互式輸入?

交互模式下的輸入使用以下語法進(jìn)行解析:

interactive_input ::=  [stmt_list] NEWLINE | compound_stmt NEWLINE

請注意在交互模式下一條(最高層級)復(fù)合語句必須帶有一個空行;這對于幫助解析器確定輸入的結(jié)束是必須的。

9.4. 表達(dá)式輸入?

eval() 被用于表達(dá)式輸入。 它會忽略開頭的空白。 傳遞給 eval() 的字符串參數(shù)必須具有以下形式:

eval_input ::=  expression_list NEWLINE*