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

另一个 Python for .NET。与 Python.NET 不同,这是一个完整的 Python 实现,它生成 IL,并将 Python 代码直接编译为 .NET 程序集。它由 Jim Hugunin 创建,他是 Jython 的最初创建者。有关更多信息,请参阅 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 的使用都是词法定义;后续章节中的使用是语法定义。