9. 最高層級元件

Python 直譯器可以從多種來源獲得輸入:作為標準輸入或程式引數自腳本傳入、以互動式鍵入、自模組原始檔引入等等。這一章將給出在這些情況下所用的語法。

9.1. 完整的 Python 程式

雖然語言規範描述不必規定語言直譯器是如何被調用(invoke)的,但對完整的 Python 程式加以說明還是很有用的。一個完整的 Python 程式會在最小初始化環境中被執行:所有內建和標準模組均為可用,但均處於未初始化狀態,只有 sys(各種系統服務)、builtins(內建函式、例外和 None)和 __main__ 除外。後者用於為完整程式的執行提供區域性和全域性命名空間 (namespace)。

用於一個完整 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*