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*