1. Introduction

本参考手册介绍了 Python 编程语言。它不打算作为教程。

当我try尽可能精确时,我选择使用英语而不是正式的规范来表示除语法和词法分析之外的所有内容。这应该使普通 Reader 更容易理解该文档,但会留下歧义的余地。因此,如果您是来自 Mars 并试图仅pass本文档重新实现 Python,则您可能不得不猜测,实际上您可能finally会实现完全不同的语言。另一方面,如果您正在使用 Python,并且想知道关于该语言特定区域的确切规则是什么,那么您肯定可以在这里找到它们。如果您想对语言进行更正式的定义,也许您可以花些时间-或发明一台克隆机:-)。

在语言参考文档中添加太多实现细节是危险的-实现可能会更改,并且同一语言的其他实现可能会以不同的方式工作。另一方面,CPython 是广泛使用的一个 Python 实现(尽管替代实现 continue 获得支持),有时值得一提其特殊之处,尤其是在实现受到其他限制的情况下。因此,您会在全文中发现一些简短的“实施说明”。

每个 Python 实现都带有许多内置和标准模块。这些记录在Python 标准库中。当它们与语言定义进行重要交互时,会提到一些内置模块。

1.1. 替代实现

尽管有一种 Python 实现是迄今为止最受欢迎的,但仍有一些替代实现对不同的 Reader 特别感兴趣。

已知的实现包括:

  • CPython

    • 这是用 C 编写的 Python 的原始且维护最全的实现。通常在这里首先出现新的语言Function。
  • Jython

    • 用 Java 实现的 Python。此实现可以用作 Java 应用程序的脚本语言,也可以用于使用 Java 类库创建应用程序。它还经常用于为 Java 库创建测试。可以在Jython 网站找到更多信息。
  • 适用于.NET 的 Python

    • 该实现实际上使用 CPython 实现,但它是托管的.NET 应用程序,并且使.NET 库可用。它是由 Brian Lloyd 创建的。有关更多信息,请参见.NET 主页的 Python
  • IronPython

    • .NET 的备用 Python。与 Python.NET 不同,这是一个完整的 Python 实现,可以生成 IL,并将 Python 代码直接编译为.NET 程序集。它是由 Jython 的原始作者 Jim Hugunin 创建的。有关更多信息,请参见IronPython 网站
  • PyPy

    • 完全用 Python 编写的 Python 实现。它支持其他实现中没有的一些高级Function,如无堆栈支持和即时编译器。该项目的目标之一是pass简化解释器(因为它是用 Python 编写)来鼓励对语言本身进行试验。 PyPy 项目的主页提供了更多信息。

这些实现中的每种实现都与本手册中所描述的语言有所不同,或者引入了标准 Python 文档所未涵盖的特定信息。请参考特定于实现的文档,以确定您需要了解的其他信息。

1.2. Notation

词法分析和语法的描述使用改良的 BNF 语法符号。这使用以下定义样式:

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

第一行说namelc_letter,后跟零个或多个lc_letter以及下划线的序列。 lc_letter依次是'a''z'的任何单个字符。 (对于本文档中词汇和语法规则中定义的名称,实际上遵守该规则.)

每个规则都以名称(即规则定义的名称)和::=开头。竖线(|)用于分隔替代项;它是此符号中约束最少的运算符。星号(*)表示前一项的零次或多次重复;同样,加号(+)表示一个或多个重复,括在方括号([ ])中的短语表示零个或一次出现(换句话说,括起来的短语是可选的)。 *+运算符尽可能紧密地绑定;括号用于分组。Literals 字符串用引号引起来。空白仅对分隔令牌有意义。规则通常包含在一行中;在第一行之后的每一行都可以以竖线开头的形式来替换具有许多替代项的规则。

在词汇定义中(如上例所示),使用了另外两种约定:用三个点分隔的两个 Literals 字符表示可以在给定(包括)ASCII 字符范围内选择任何单个字符。尖括号(<...>)之间的短语给出了所定义符号的非正式描述;例如,如果需要,可用于描述“控制字符”的概念。

即使使用的表示法几乎相同,但词法定义和句法定义的含义还是有很大差异:词法定义对 Importing 源的各个字符进行操作,而语法定义对由 Importing 源生成的标记流进行操作词法分析。下一章(“词法分析”)中对 BNF 的所有使用都是词法定义。后续各章中使用的是语法定义。