9. 頂層元件

Python 直譯器可以從多個來源獲取輸入:從作為標準輸入或程式引數傳遞給它的指令碼、互動式鍵入、模組原始檔等。本章給出了在這些情況下使用的語法。

9.1. 完整的 Python 程式

雖然語言規範不需要規定如何呼叫語言直譯器,但有一個完整的 Python 程式的概念是很有用的。一個完整的 Python 程式在一個最小初始化的環境中執行:所有內建和標準模組都可用,但除了 sys (各種系統服務), builtins (內建函式、異常和 None) 以及 __main__ 之外,都沒有被初始化。後者用於為完整程式的執行提供區域性和全域性名稱空間。

完整的 Python 程式的語法與下一節描述的檔案輸入的語法相同。

直譯器也可以在互動模式下呼叫;在這種情況下,它不讀取和執行一個完整的程式,而是一次讀取和執行一條語句(可能是複合語句)。初始環境與完整程式的相同;每條語句都在 __main__ 的名稱空間中執行。

一個完整的程式可以透過三種形式傳遞給直譯器:使用 -c string 命令列選項,作為第一個命令列引數傳遞的檔案,或作為標準輸入。如果檔案或標準輸入是 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*