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