1. 介绍

本参考手册介绍了Python编程语言。它不是作为一个教程。

虽然我想尽可能精确,我选择使用英语而不是形式规范除了语法和词法分析。这应该使文档对于普通读者来说更容易理解,但是会留下模糊的空间。因此,如果你来自火星,并试图从这个文件单独重新实现Python,你可能不得不猜测的事情,事实上,你可能会最终实现相当不同的语言。另一方面,如果你正在使用Python并想知道关于语言的特定区域的确切规则,你应该肯定能够在这里找到它们。如果你想看到一个更正式的语言定义,也许你可以自愿你的时间 - 或发明一个克隆机:-)。

将太多的实现细节添加到语言参考文档是危险的 - 实现可能改变,并且相同语言的其他实现可能工作不同。另一方面,CPython是广泛使用的一个Python实现(虽然替代实现继续获得支持),并且其特殊的怪癖有时值得提及,特别是在实施施加额外的限制的地方。因此,你会发现短的“实现注释”洒在整个文本。

每个Python实现都有一些内建和标准模块。它们的文档在Python标准库当一些内建模块以重要的方式与语言定义交互时,它们被提及。

1.1. 各种实现

虽然有一个Python实现是目前最受欢迎的,但有一些替代实现,对不同的受众特别感兴趣。

已知的实现包括:

CPython
这是Python初始的以及维护得最好的实现,使用C编写。新的语言特性一般会最先在这里出现。
Jython
Python在Java中实现。此实现可用作Java应用程序的脚本语言,或可用于使用Java类库创建应用程序。它也经常用于为Java库创建测试。有关详细信息,请参阅Jython网站
Python for .NET
此实现实际上使用CPython实现,但是是一个托管的.NET应用程序,并使.NET库可用。它由Brian Lloyd创建。更多信息请参阅.NET版Python的主页
IronPython
一种替代Python for .NET。与Python.NET不同,这是一个完整的Python实现,它生成IL,并将Python代码直接编译为.NET程序集。它是由Jython的原创作者Jim Hugunin创建的。有关详细信息,请参阅IronPython网站
PyPy
完全用Python编写的Python实现。它支持在其他实现中没有找到的几个高级功能,如stackless支持和一个Just in Time编译器。该项目的目标之一是鼓励用语言本身的实验,通过更容易修改解释器(因为它是用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都是词法定义;再往后的几章是语法定义。