Python 3 文档(简体中文) 3.2.2 documentation

Version: 3.2.2

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
另一份 .NET 上的 Python. 与 Python.NET 不一样, 这是一份完整的能产生 IL (译者注: 中间码) 的 Python 实现. 它由 Jim Hugunin 创造, Jim Hugunin 也是 Jython 的原始作者. 取得更多信息, 参照 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_letter 和下划线. 而一个 lc_letter 是从 'a''z' 的任意一个字符. (事实上这也是该文档中这些名字定义的规则)

每一条规则以一个名字 (这条规则定义的名字) 和 ::= 开始. 竖线 (|) 用来分隔两者挑一的内容; 它是该表示法中最低优先级的符号. 星号 (*) 表示零个或更多之前项目的重复; 同样的, 加号 (+) 表示一个或更多重复, 而方括号 ([ ]) 里的内容表示它发生了零次或一次 (换句话说, 该内容是可选的). *+ 符号有着最高的优先级; 圆括号用来分组. 字符串被引号包围. 空白只能够用来分隔标识符. 规则通常使用一行; 有很多两者挑一的内容的规则可能会使用每一个可替代内容占一行的格式, 除第一行以外, 每一行以一个竖线开始.

在词法定义中 (如上面的例子), 还使用了两个额外的约定: 被三个点号分隔的两个字符表示在这两个字符范围内的某个 ASCII 字符. 在尖括号 (<...>) 中的短语给出了符号的非正式描述; 例如, 在需要时这可以用来描述 ‘控制符’ 的概念.

词法和语法定义虽然使用的表示法几乎完全一样, 但在意义上有一个巨大的不同: 词法分析运作在输入源的个体的字符上面, 而语法定义运作在由词法分析生成的标识符流上面. 在下一章 (“词法分析”) 里所有 BNF 的使用都是词法定义; 再随后的一章是语法定义.