CPython 源码中包含了 Python 语言的定义。其作为参考规范供所有 Python 解释器使用。
此规范使用了人机可读的文件格式。文档内是对 Python 语言的详细解释,其定义了容许的内容和每个语句的行为。
语言说明文档位于 Doc/reference
目录中,此文档用 reStructuredText
格式解释了 Python 语言的每一个特性。这些文件形成了官方的 《Python 参考文档》。
此目录中有你要了解的整个语言、结构体和关键词的文件:
在 Doc/reference/compound_stmts.rst
中,你可以看见一个定义 with
语句的简单例子。
with
语句有很多形式,最简单的形式是上下文管理的实例化和嵌套代码块:
with x():
...
你可以使用 as
关键词将结果赋值给变量:
with x() as y:
...
你还可以使用逗号将上下文管理器连接起来:
with x() as y, z() as jk:
...
此文档包含了用户可读的语言规范,而机器可读的规范位于Grammar/Grammar
中。
{% hint style="info" %} Important
本节引用了“旧解析器”使用的语法文件。在本书即将发布时,“新的解析器”( PEG 解析器)正处于实验阶段。
对于 CPython 3.8 及之前的版本, 默认的解析器是 pgen 解析器。而对于 CPython 3.9及之后的版本, 默认的解析器是 PEG 解析器。老的解析器可以通过`-X oldparser`命令行来启用。 {% endhint %}
语法文件是用一种被称为巴科斯范式 (BNF) 的上下文表示法编写的。BNF 不是 Python 语言特有的,也被其他众多语言作为语法表示方式。
编程语言中的语法结构概念从诺姆·乔姆斯基在19世纪50年代对语法结构方面的研究中获得启发。Python 的语法文件使用扩充巴科斯范式 (EBNF) 和正则表达式语法。因此,在语法文件中你可以使用:
- * 用于零次或多次重复;
- + 用于一次或多次重复;
- [] 用于可选部分;
- | 用于可选择项;
- () 用于定义优先级。
举一个实例的例子来说明,如果让你定义一杯咖啡,你会怎么来定义:
- 它一定有一个杯子;
- 它必须包含一杯及以上的浓咖啡;
- 它可以有牛奶,但此项是可选择的;
- 你可以将多类牛奶加入到咖啡中,比如:全脂牛奶,脱脂牛奶以及豆奶。
用 EBNF 来定义一杯咖啡,定义逻辑如下所示:
在本章节,我们用铁路图来展示语法。下图是定义咖啡语句的铁路图。
在铁路图中,每个可能的组合都必须要从左到右排成一行。其中可选的语句可以被绕过,而一些语句可以形成循环。
如果你在语法文件中搜索 with_stmt
, 你可以看见如下定义:
引号中的任何内容都是字符串文字,被称为终端。终端是用于识别关键字的。with_stmt
被定义为:
- 从
with
开头 - 后面跟一个
with_item
, 它由一个test
和可选的as
和表达式构成 - 可以跟随若干个
with_item
, 由逗号隔开 - 以一个
:
结束 - 接着跟一个
suite
在这两行中还引用了其他三个定义:
suite
指的是包含一个或多个语句的代码块test
指的是已经被评估过的一个简单语句expr
指的是一个简单表达式
用铁路图进行可视化展示,with
语句看起来像如下图:
作为一个更加复杂的案例,try
语句的定义如下图:
try
语句有有两种用法:
try
有一个或多个except
从句,后跟一个可选的else
, 然后是一个可选的finally
try
只有一个finally
语句
或者用铁路图来展现,如下图所示:
try
语句是一个更加复杂结构的优秀示例。如果你想更加详细了解 Python 语言,可以详细查看 Grammar/Grammar
目录。