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