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 所提议的语法所包含的特性属于此类。本 PEP 支持声明此类特性,并支持逐步淘汰在新特性下其语义发生变化的构造的“旧”含义。然而,它没有定义任何关于哪些特性最终必须被淘汰的策略。
  • 那些旨在永远保持可选的特性,例如,如果它们更改了解释器中的某些默认设置。此类设置的一个例子可能是要求始终为特定模块发出行号指令;本规范中没有提出任何此类特定标志。

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

语法

directive_statement 是一种形式的语句

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

指令中的名称指示指令的类型;它定义了可选的 atom 是否可以存在,以及对该 atom 是否有进一步的语法或语义限制。此外,根据指令的名称,可能会对指令施加某些额外的语法或语义限制(例如,指令在模块中的位置可能限制为模块的顶部)。

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

语义

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

具体指令:transitional

如果向 Python 添加了不兼容的语法或语义更改,PEP 5 要求语言进行过渡性演进,其中新特性最初与旧特性并行可用。这种过渡可以通过过渡指令来实现。

在过渡指令中,NAME 是 'transitional'。atom 必须存在,并且必须是 NAME。该名称的可能值在定义语言更改时定义。此类指令的一个示例是

directive transitional nested_scopes

过渡指令必须出现在模块中的任何其他语句之前,除了文档字符串(即,它只能作为模块的第二条语句出现,如果第一条语句是 STRING+)。

向后兼容性

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

未解决问题:directive 作为第一个标识符

在模块中使用 directive 如下

directive = 1

(即名称 directive 作为模块中的第一项出现)将把它视为关键字,而不是标识符。可以将它分类为带有一个额外的前瞻标记的 NAME,但 Python 词法分析器中没有这种前瞻。

问答

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

答: 不是。尽管 directive 功能可以扩展以允许源代码编码,但没有提出特定的 directive。

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

答: 它作为PEP 236的反提案,该提案建议用新含义重载 import 语句。本 PEP 允许以更通用的方式解决问题。

问: 但是将源代码编码和语言更改混为一谈,是不是就像混淆了苹果和橘子?

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


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

上次修改:2025-02-01 08:55:40 GMT