PEP 221 – 导入为
- 作者:
- Thomas Wouters <thomas at python.org>
- 状态:
- 最终版
- 类型:
- 标准跟踪
- 创建日期:
- 2000年8月15日
- Python 版本:
- 2.0
- 发布历史:
引言
本 PEP 描述了 Python 2.0 的 import as 提案。本 PEP 跟踪此功能的状况和所有权。它包含对该功能的描述,并概述了支持该功能所需的更改。此文件的 CVS 修订历史记录包含明确的历史记录。
基本原理
本 PEP 提议扩展 Python 语法中关于 import 和 from <module> import 语句的部分。这些语句加载模块,并将其绑定到本地名称,或将该模块中的对象绑定到本地名称。然而,有时希望将这些对象绑定到不同的名称,例如为了避免名称冲突。这目前可以通过以下惯用法实现
import os
real_os = os
del os
对于 from ... import 语句也类似
from os import fdopen, exit, stat
os_fdopen = fdopen
os_stat = stat
del fdopen, stat
提议的语法更改将在这两个语句中添加一个可选的 as 子句,如下所示
import os as real_os
from os import fdopen as os_fdopen, exit, stat as os_stat
as 名称并非旨在成为关键字,并且必须使用一些技巧才能使 CPython 解析器相信它不是关键字。然而,对于更高级的解析器/分词器来说,这应该不是问题。
对于导入子模块存在一个稍微特殊的案例。语句
import os.path
在本地存储模块 os 为 os,以便导入的子模块 path 可以作为 os.path 访问。因此,
import os.path as p
将 os.path 存储在 p 中,而不是 os。这使得它实际上与
from os import path as p
实现细节
本 PEP 已被接受,建议的代码更改已提交。补丁仍可在 SourceForge 补丁管理器中找到 [1]。目前,语法中使用了 NAME 字段而不是裸字符串,以避免关键字问题。它引入了一个新的字节码 IMPORT_STAR,它执行 from module import * 行为,并更改了 IMPORT_FROM 字节码的行为,使其将请求的名称(始终是单个名称)加载到堆栈上,随后由 STORE 操作码存储。因此,所有明确导入的名称现在都遵循 global 指令。
from module import * 的特殊情况仍然是一个特殊情况,因为它不能包含 as 子句,并且不会生成 STORE 操作码;导入的对象直接加载到本地命名空间中。这也意味着以这种方式导入的名称始终是本地的,并且不遵循 global 指令。
还建议对该语法进行额外更改,以泛化 as 子句后给出的表达式。除了单个名称,它还可以是任何产生有效左值(可以赋值的任何东西)的表达式。容纳此更改的修改是最小的,正如补丁 [2] 所证明的那样,并且由此产生的泛化允许许多与其他 Python 赋值构造完全并行的新的构造。然而,这个想法被 Guido 否决了,称之为“过度泛化”。
版权
本文档已置于公共领域。
参考资料
来源:https://github.com/python/peps/blob/main/peps/pep-0221.rst