9. 頂層元件

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

9.1. 完整的 Python 程式

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

完整 Python 程式的語法是用於檔案輸入的語法,將在下一節中描述。

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

一個完整的程式可以透過三種形式傳遞給直譯器:使用 -c string 命令列選項,作為第一個命令列引數傳遞的檔案,或作為標準輸入。如果檔案或標準輸入是 tty 裝置,直譯器將進入互動模式;否則,它將把檔案作為一個完整的程式來執行。

9.2. 檔案輸入

所有從非互動式檔案讀取的輸入都具有相同的形式

file_input: (NEWLINE | statement)* ENDMARKER

此語法用於以下情況

  • 當解析一個完整的 Python 程式時(從檔案或字串);

  • 當解析一個模組時;

  • 當解析傳遞給 exec() 函式的字串時;

9.3. 互動式輸入

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

interactive_input: [stmt_list] NEWLINE | compound_stmt NEWLINE | ENDMARKER

請注意,一個(頂層)複合語句在互動模式下必須後跟一個空行;這是為了幫助解析器檢測輸入的結束。

9.4. 表示式輸入

eval() 用於表示式輸入。它會忽略前導的空白。傳遞給 eval() 的字串引數必須具有以下形式

eval_input: expression_list NEWLINE* ENDMARKER