Following system colour scheme - Python 增强提案 Selected dark colour scheme - Python 增强提案 Selected light colour scheme - Python 增强提案

Python 增强提案

PEP 244 – directive 语句

作者:
Martin von Löwis <martin at v.loewis.de>
状态:
已拒绝
类型:
标准跟踪
创建:
2001 年 3 月 20 日
Python 版本:
2.1
历史记录:


目录

动机

Python 偶尔会对核心语言结构的公布语义进行不兼容的更改,或者以某种方式更改其意外(实现相关的)行为。虽然这样做绝不会是任性的,而且始终是为了从长远来看改善语言,但在短期内,它是有争议且具有破坏性的。

PEP 5,语言演进指南建议了一些减轻痛苦的方法,本 PEP 介绍了一些支持该方法的机制。

PEP 227,静态嵌套作用域是第一个应用,并将在此作为示例。

当添加一个新的、可能不兼容的语言特性时,一些模块和库可能会选择使用它,而另一些则可能不会。本规范引入了模块作者可以使用的一种语法,以表明某个模块是否使用了特定语言特性。

在讨论本 PEP 时,读者评论说有两种“可设置”的语言特性

  • 那些最终将成为唯一选项的特性,到那时,指定它们的使用就不再必要了。适用于“返回 __future__”的语法的特性 PEP 236,返回 __future__ 提案属于此类。本 PEP 支持声明此类特性,并支持逐步淘汰语义在新的特性下发生变化的结构的“旧”含义。但是,它没有定义哪些特性必须最终逐步淘汰的策略。
  • 那些旨在永远保持可选的特性,例如,如果它们更改了解释器中的某些默认设置。这种设置的一个示例可能是请求始终为特定模块发出行号指令;本规范中没有提出任何此类特定标志。

由于本 PEP 的主要目标是支持新的语言结构,而不立即破坏旧的库,因此特别注意不要通过引入新的语法来破坏旧的库。

语法

指令语句是一种形式为以下形式的语句

directive_statement: 'directive' ``NAME`` [atom] [';'] NEWLINE

指令中的名称指示指令的类型;它定义了可选原子是否存在,以及原子是否存在其他语法或语义限制。此外,根据指令的名称,可能会对指令施加一些其他语法或语义限制(例如,指令在模块中的放置可能会限制在模块的顶部)。

在指令语句中,directive 是一个新关键字。根据 PEP 5,此关键字最初仅在指令语句中使用时才被视为关键字,请参见下面的“向后兼容性”。

语义

指令语句指示 Python 解释器以不同的方式处理源文件;该处理的具体细节取决于指令名称。可选原子通常在处理源代码时被解释;该解释的细节取决于指令。

特定指令:过渡

如果 Python 添加了语法或语义更改,这些更改是不兼容的,PEP 5 规定了语言的过渡演进,其中新特性最初与旧特性一起提供。这种过渡可以通过过渡指令来实现。

在过渡指令中,NAME 为“transitional”。原子 MUST 存在,并且 MUST 为 NAME。该名称的可能值是在定义语言更改时定义的。此类指令的一个示例是

directive transitional nested_scopes

过渡指令 MUST 发生在模块中任何其他语句之前,除了文档字符串(即,如果第一个语句为 STRING+,它可能仅作为模块的第二个语句出现)。

向后兼容性

directive 作为新关键字引入可能会导致与现有代码不兼容。遵循 PEP 5 中的指南,在本规范的初始实现中,directive 仅在它用在有效的 directive_statement 中时才是一个新关键字(即,如果它作为模块中的第一个非字符串标记出现)。

未解决的问题:指令作为第一个标识符

在模块中使用 directive 作为

directive = 1

(即,名称 directive 作为模块中的第一项出现)会将其视为关键字,而不是标识符。可以将其分类为具有附加前瞻令牌的 NAME,但 Python 词法分析器中没有此类前瞻。

问答

问:看起来本 PEP 是为了允许定义源代码字符集而编写的。这是真的吗?

答:不。即使指令功能可以扩展以允许源代码编码,也没有提出任何特定指令。

问:那为什么写这个 PEP 呢?

答:它充当对 PEP 236 的反提案,该提案建议用新的含义重载导入语句。本 PEP 允许以更通用的方式解决这个问题。

问:但混合源代码编码和语言更改就像混合苹果和橘子一样,不是吗?

答:也许吧。为了解决这种差异,定义了预定义的“transitional”指令。


来源:https://github.com/python/peps/blob/main/peps/pep-0244.rst

上次修改时间:2023-09-09 17:39:29 GMT