Skip to content

Latest commit

 

History

History
112 lines (69 loc) · 4.62 KB

5.2-python-language-specification.md

File metadata and controls

112 lines (69 loc) · 4.62 KB

5.2 Python 语言规范

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 被定义为:

  1. with 开头
  2. 后面跟一个 with_item, 它由一个 test 和可选的 as 和表达式构成
  3. 可以跟随若干个 with_item, 由逗号隔开
  4. 以一个 结束
  5. 接着跟一个 suite

在这两行中还引用了其他三个定义:

  • suite 指的是包含一个或多个语句的代码块
  • test 指的是已经被评估过的一个简单语句
  • expr 指的是一个简单表达式

用铁路图进行可视化展示,with 语句看起来像如下图:

作为一个更加复杂的案例,try 语句的定义如下图:

try 语句有有两种用法:

  1. try 有一个或多个 except 从句,后跟一个可选的 else , 然后是一个可选的 finally
  2. try 只有一个 finally 语句

或者用铁路图来展现,如下图所示:

try 语句是一个更加复杂结构的优秀示例。如果你想更加详细了解 Python 语言,可以详细查看 Grammar/Grammar 目录。