PEP 221 – 使用 as 导入
- 作者:
- 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
(而不是 os
)存储在 p
中。这使得它实际上与以下语句相同
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
上次修改: 2023-09-09 17:39:29 GMT