Python允许通过import语句中的...as <ALIAS>
子句对输入进行别名处理,如下所示:
import mymodule as somealias
from myothermodule import spam as spamalias, ham as hamalias
现在,至少在默认情况下,导入语句(包括那些具有as
- 类似于上述语句的语句)会导致调用__builtin__.__import__
,其参数列表不包括此类别名的名称。 IOW,AFAICT,以下“无别名”导入语句产生与__builtin__.__import__
相同的调用,与上面引用的import语句一样:
import mymodule
from myothermodule import spam, ham
那么这些别名如何进入导入过程? Python是否提供了自定义导入过程如何使用别名的方法?
(我没有任何具体的应用程序;我只是想更好地了解Python的工作原理。)
答案 0 :(得分:12)
函数__import__()
不绑定调用范围中的任何名称。基本上,
import foo
类似于
foo = __import__("foo")
和
import foo as bar
类似于
bar = __import__("foo")
名称绑定发生在调用范围内,而不是在函数内部,因此__import__()
不需要来知道模块最终将绑定到哪个名称。
这也可以从这些语句的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
从堆栈中弹出模块并将其绑定到本地名称。您可以看到两个片段之间的唯一区别是模块存储的名称。