本参考手册描述 Python 编程语言,但它不打算作为教程。
尽管我想写得尽可能准确,但我还是选择用英语而不是正式的规范语言来写语法和词法分析以外的所有内容。这将使本文对普通读者来说更容易理解,但也为含糊其辞埋下了伏笔。因此,如果您来自火星,并试图单纯根据本文来重新实现 Python,您可能不得不多加猜测,事实上,您最终很可能会实现一种完全不同的语言。另一方面,如果您正在使用 Python,并且想知道语言特定部分的确切规则是什么,那么您一定可以在这里找到它们。如果您想看到更正式的语言定义,也许可以把您的时间贡献出来——或者去发明一种克隆机器 :-)。
将太多实现细节添加到语言参考文档中是危险的——实现可能会改变,而语言的其他实现也可能会有所不同。另一方面,CPython 是被广泛使用的 Python 实现 (虽然可选实现继续获得支持),有时它的特殊怪癖值得一提,特别是在它强加了某些额外限制的时候。因此,您将在本文各处找到简短的“实现说明”。
每个 Python 实现都附带了许多内置和标准模块。它们被收录在 Python 标准库中。本文偶尔会提及少量对语言定义有重大影响的内置模块。
1.1 可选实现
尽管有一种迄今为止最流行的 Python 实现 ,但此外还有一些对某些人而言特别感兴趣的实现。
已知的实现包括:
CPython
这是最早和支持最好的 Python 实现,用 C 写成。新的语言功能通常首先在此出现。
JPython
Java 中的 Python 实现。此实现可以用作 Java 应用程序的脚本语言,也可用于创建使用 Java 类库的应用程序。它通常还用于为 Java 创建测试。更多信息可以在 Jython 网站找到。
Python for .NET
这一实现实际上使用了 CPython 实现,但它是一个托管的 .NET 应用程序,而且可以使用 .NET 库。它由 Brian Lloyd 创建。更多信息请参阅 Python for .NET 主页。
IronPython
另一个可选的 Python for .NET。与 Python for .NET 不同,这是一个完整的 Python 实现,它生成 IL ,并将 Python 语言直接编译为 .NET 程序集。它是由 Jython 最初的创建者 Jim Hugunin 所创建的。有关详细信息,请参阅 IronPython 网站。
PyPy
一个完全用 Python 编写的 Python 实现。它支持几个其他实现中没有的高级特性,例如 stackless 支持和 JIT 编译程序。该项目的目标之一是通过简化解释程序 (因为它是用 Python 编写的) 来鼓励对语言本身进行实验。其他信息可以从 PyPy 项目主页获得。
这些实现在某种程度上与本手册所述的语言有所不同,或者引入了标准 Python 文档所涵盖内容以外的特定信息。请参阅特定于实现的文档,以确定您所使用的特定实现还需了解哪些内容。
1.2 表示法
对词法分析和语法的描述使用修改后的 BNF 语法表示法。它使用以下定义风格:
name ::= lc_letter (lc_letter | "_")*
lc_letter ::= "a"..."z"
第一行表示 name 是以 lc_letter 开头,后跟零个或多个 lc_letters 和下划线的序列。而 lc_letter 则是“a”到“z”之间的任意单个字符。(此规则实际上遵循了本文词法和语法规则中对名字的定义。)
每条规则以名字 (该规则定义的名字) 和 ::= 开头。竖线 (|) 用于分隔可选项;它是此表示法中的最小绑定操作符。星号 (*) 表示前一项的零次或多次重复;同样,加号 (+) 表示一次或多次重复,而中括号 ([]) 中的短语意味着出现零或一次 (换言之,所包含的短语是可选的)。* 和 + 操作符尽最大可能紧密绑定;括号用于分组。字符串字面值用引号括起。空白只对分隔标记有意义。规则通常包含在单行中 ;有多个可选项的规则可以被格式化为多行,每行都从一条竖线开始。
在词法定义 (如上例) 中,还使用两个进一步的约定:用三个点分隔的两个字面值字符意味着在给定 (包含) 的 ASCII 字符范围内选择任意单个字符。尖括号 (<...>) 之间的短语为定义的符号给出非正式描述;例如,它可以在需要时用来描述“控制字符”的概念。
尽管使用的表示法几乎相同,但词法和语法定义的含义有很大区别:词法定义在输入源的单个字符上进行操作,而语法定义则在词法分析生成的标记流上进行操作。在下一章 (“词法分析”) 中,所有 BNF 的用法都是词法定义;后面章节中的用法都是语法定义。
网友评论