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*