9. 最高層級組件?

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

9.1. 完整的 Python 程序?

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

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

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

一個完整程序可通過三種形式被傳遞給解釋器:使用 -c 字符串 命令行選項,使用一個文件作為第一個命令行參數,或者使用標準輸入。 如果文件或標準輸入是一個 tty 設置,解釋器會進入交互模式;否則的話,它會將文件當作一個完整程序來執行。

9.2. 文件輸入?

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

file_input ::=  (NEWLINE | statement)*

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

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

  • 解析一個模塊時;

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

9.3. 交互式輸入?

交互模式下的輸入使用以下語法進行解析:

interactive_input ::=  [stmt_list] NEWLINE | compound_stmt NEWLINE

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

9.4. 表達式輸入?

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

eval_input ::=  expression_list NEWLINE*