1. 簡介

本參考手冊描述了 Python 程式語言。它並非旨在作為教程。

雖然我力求儘可能精確,但我選擇使用英語而非正式規範,除了語法和詞法分析部分。這應該使文件對普通讀者更易理解,但也為歧義留下了空間。因此,如果您來自火星並試圖僅根據本文件重新實現 Python,您可能不得不猜測一些事情,而且實際上您最終可能會實現一種完全不同的語言。另一方面,如果您正在使用 Python 並想知道關於該語言特定領域的精確規則,您應該絕對能夠在這裡找到它們。如果您希望看到更正式的語言定義,也許您可以志願貢獻您的時間 — 或者發明一臺克隆機器 :-)。

在語言參考文件中新增過多的實現細節是危險的 — 實現可能會改變,而且同一語言的其他實現可能會以不同的方式工作。另一方面,CPython 是廣泛使用的 Python 實現(儘管其他實現繼續獲得支援),並且它的特殊怪癖有時值得一提,尤其是在實現施加額外限制的地方。因此,您會在文字中發現零星的“實現註釋”。

每個 Python 實現都附帶許多內建和標準模組。這些在 Python 標準庫 中有文件記錄。當一些內建模組與語言定義以重要方式互動時,會提及它們。

1.1. 其他實現

儘管有一個 Python 實現是最受歡迎的,但也有一些其他實現對不同的受眾特別感興趣。

已知的實現包括

CPython

這是 Python 的原始且維護最多的實現,用 C 編寫。新的語言特性通常首先出現在這裡。

Jython

用 Java 實現的 Python。此實現可以用作 Java 應用程式的指令碼語言,也可以用於使用 Java 類庫建立應用程式。它也經常用於為 Java 庫建立測試。有關更多資訊,請訪問 Jython 網站

Python for .NET

此實現實際上使用 CPython 實現,但它是一個託管的 .NET 應用程式,並使 .NET 庫可用。它由 Brian Lloyd 建立。有關更多資訊,請參閱 Python for .NET 主頁

IronPython

另一種用於 .NET 的 Python。與 Python.NET 不同,這是一個完整的 Python 實現,它生成 IL,並將 Python 程式碼直接編譯為 .NET 程式集。它由 Jython 的原始建立者 Jim Hugunin 建立。有關更多資訊,請參閱 IronPython 網站

PyPy

完全用 Python 編寫的 Python 實現。它支援其他實現中沒有的幾個高階功能,如無堆疊支援和即時編譯器。該專案的目標之一是透過使修改直譯器更容易(因為它用 Python 編寫)來鼓勵對語言本身的實驗。更多資訊可在 PyPy 專案的主頁 上找到。

這些實現中的每一個都以某種方式與本手冊中記錄的語言有所不同,或者引入了超出標準 Python 文件中涵蓋的特定資訊。請參閱特定於實現的文件,以確定您需要了解的有關您正在使用的特定實現的任何其他資訊。

1.2. 符號

詞法分析和語法的描述使用了修改後的 巴科斯正規化(BNF) 語法表示法。它使用以下定義樣式

name      ::=  lc_letter (lc_letter | "_")*
lc_letter ::=  "a"..."z"

第一行表示一個 name 是一個 lc_letter,後跟零個或多個 lc_letter 和下劃線的序列。lc_letter 反過來是 'a''z' 的任何單個字元。(此規則實際上適用於本文件中詞法和語法規則中定義的名稱。)

每個規則都以一個名稱(這是由該規則定義的名稱)和 ::= 開頭。豎線 (|) 用於分隔備選項;它是此表示法中繫結性最弱的運算子。星號 (*) 表示重複零次或多次前面的項;同樣,加號 (+) 表示重複一次或多次,而方括號 ([ ]) 中括起來的短語表示出現零次或一次(換句話說,括起來的短語是可選的)。 *+ 運算子儘可能緊密地繫結;括號用於分組。文字字串用引號括起來。空格僅對分隔標記有意義。規則通常包含在單行上;具有多個備選項的規則可以以替代方式格式化,其中第一行之後的每一行都以豎線開頭。

在詞法定義中(如上面的示例),還使用了另外兩個約定:兩個用三個點分隔的文字字元表示給定(包括)ASCII 字元範圍中任何單個字元的選擇。尖括號 (<...>) 之間的短語給出了所定義符號的非正式描述;例如,如果需要,這可以用來描述“控制字元”的概念。

儘管使用的表示法幾乎相同,但詞法定義和語法定義之間存在很大的差異:詞法定義對輸入源的單個字元進行操作,而語法定義對詞法分析生成的標記流進行操作。下一章(“詞法分析”)中所有 BNF 的使用都是詞法定義;後續章節中的使用是語法定義。