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都是词法定义;再往后的几章是语法定义。