gpt4 book ai didi

python - __import__ 从哪里获取别名?

转载 作者:行者123 更新时间:2023-11-28 19:45:17 24 4
gpt4 key购买 nike

Python 允许使用别名导入,通过 ...as <ALIAS> import 语句中的子句,如下所示:

import mymodule as somealias
from myothermodule import spam as spamalias, ham as hamalias

现在,至少在默认情况下,导入语句,包括那些有 as 的语句- 类似上面的子句,导致调用 __builtin__.__import__其参数列表包括此类别名的名称。 IOW,AFAICT,以下“无别名”导入语句产生对 __builtin__.__import__ 的相同调用与上面引用的导入语句一样:

import mymodule
from myothermodule import spam, ham

那么这些别名是如何进入导入流程的呢? Python 是否提供自定义导入过程如何使用别名的方法?

(我没有任何特定的应用程序;我只是想更好地理解 Python 的工作原理。)

最佳答案

函数 __import__() 不绑定(bind)调用范围内的任何名称。基本上,

import foo

类似于

foo = __import__("foo")

import foo as bar

类似于

bar = __import__("foo")

名称绑定(bind)发生在调用范围内,而不是函数内部,因此 __import__() 不需要知道模块最终将绑定(bind)到什么名称。

从这些语句的CPython字节码也可以看出来:

>>> dis.dis(compile("import foo", "", "exec"))
1 0 LOAD_CONST 0 (-1)
3 LOAD_CONST 1 (None)
6 IMPORT_NAME 0 (foo)
9 STORE_NAME 0 (foo)
12 LOAD_CONST 1 (None)
15 RETURN_VALUE
>>> dis.dis(compile("import foo as bar", "", "exec"))
1 0 LOAD_CONST 0 (-1)
3 LOAD_CONST 1 (None)
6 IMPORT_NAME 0 (foo)
9 STORE_NAME 1 (bar)
12 LOAD_CONST 1 (None)
15 RETURN_VALUE

IMPORT_NAME 操作码隐式调用 __import__() 并将生成的模块留在内部堆栈中。随后的 STORE_NAME 从堆栈中弹出模块并将其绑定(bind)到本地名称。您可以看到这两个片段之间的唯一区别是模块存储到哪个名称。

关于python - __import__ 从哪里获取别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11263027/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com