1. 介绍

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

当我试图尽可能精确的时候,除了语法和词法分析,我选择了使用英语而不是正式的规范。这会使普通读者更容易理解文档,但会留下模棱两可的空间。因此,如果您来自mars并试图仅从这个文档中重新实现python,那么您可能需要猜测一些事情,实际上,您最终可能会实现一种完全不同的语言。另一方面,如果您使用的是Python,并且想知道该语言特定区域的精确规则是什么,那么您一定能够在这里找到它们。如果你想看到一个更正式的语言定义,也许你可以自愿花时间---或者发明一台复制机器。

在语言引用文档中添加过多的实现细节是危险的——实现可能会更改,同一语言的其他实现可能工作不同。另一方面,cpython是一个广泛使用的Python实现(尽管替代实现继续获得支持),它的特殊特性有时值得提及,特别是在实现施加了额外限制的情况下。因此,您会发现文本中散布着简短的“实现说明”。

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

1.1. 其他实现

尽管有一个迄今为止最流行的Python实现,但也有一些对不同的受众特别感兴趣的替代实现。

已知的实现包括:

CPython

这是用C编写的Python的原始和最维护的实现。新的语言特性通常首先出现在这里。

Jython公司

Python在Java中实现。此实现可以用作Java应用程序的脚本语言,或者可以用于使用Java类库创建应用程序。它也经常用于为Java库创建测试。有关更多信息,请访问 the Jython website .

用于.NET的python

此实现实际上使用了cpython实现,但它是一个托管的.NET应用程序,并使.NET库可用。它是由布莱恩·劳埃德创作的。有关详细信息,请参阅 Python for .NET home page .

IronPython

.NET的另一个python。与python.net不同,这是一个完整的python实现,它生成IL,并将python代码直接编译到.NET程序集。它是由吉姆胡古宁,Jython的原始创造者创造的。有关详细信息,请参阅 the IronPython website .

PyPy

完全用Python编写的Python实现。它支持其他实现中没有的几个高级功能,比如无堆栈支持和实时编译器。该项目的目标之一是通过使解释器更容易修改(因为它是用Python编写的),鼓励对语言本身进行实验。有关更多信息,请访问 the PyPy project's home page .

这些实现中的每一个都在某种程度上不同于本手册中所记录的语言,或者在标准的Python文档中所涵盖的内容之外引入特定的信息。请参考特定于实现的文档,以确定您还需要了解关于正在使用的特定实现的其他信息。

1.2. 符号

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

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

第一行写的是 name 是一个 lc_letter 后跟一个零或更多的序列 lc_letter s和下划线。安 lc_letter 依次是任何单个字符 'a' 通过 'z' . (对于本文档中词汇和语法规则中定义的名称,实际上遵守了此规则。)

每个规则以一个名称(该名称由规则定义)开头,并且 ::= . 竖杆 (| )用于分隔可选项;它是此符号中绑定最少的运算符。明星 (* )指前一项的零次或多次重复;同样,加 (+ )指一次或多次重复,以及用方括号括起来的短语。 ([ ] )表示零次或一次(换句话说,所附短语是可选的)。这个 *+ 运算符尽可能紧密地绑定;括号用于分组。文字字符串用引号括起来。空白仅对分隔令牌有意义。规则通常包含在一行中;具有多个可选选项的规则可以在第一行后的每一行中交替格式化,并以竖线开始。

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

尽管所使用的符号几乎相同,但词汇定义和句法定义的含义有很大的区别:词汇定义对输入源的单个字符进行操作,而语法定义对词汇分析生成的标记流进行操作。下一章中使用的bnf(“词汇分析”)都是词汇定义;后面章节中使用的是句法定义。