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 的使用都是词法定义;后续章节中的使用是语法定义。