__import__从哪里获取别名?

kjo*_*kjo 2 python import alias

Python允许通过...as <ALIAS>import语句中的子句对输入进行别名处理,如下所示:

import mymodule as somealias
from myothermodule import spam as spamalias, ham as hamalias
Run Code Online (Sandbox Code Playgroud)

现在,至少在默认情况下,import语句(包括那些具有as上述类似条件的语句)会导致调用__builtin__.__import__其参数列表包含此类别名的名称.IOW,AFAICT,以下"无别名"导入语句产生与__builtin__.__import__上面引用的import语句相同的调用:

import mymodule
from myothermodule import spam, ham
Run Code Online (Sandbox Code Playgroud)

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

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

Sve*_*ach 12

该函数__import__()不绑定调用范围中的任何名称.基本上,

import foo
Run Code Online (Sandbox Code Playgroud)

类似于

foo = __import__("foo")
Run Code Online (Sandbox Code Playgroud)

import foo as bar
Run Code Online (Sandbox Code Playgroud)

类似于

bar = __import__("foo")
Run Code Online (Sandbox Code Playgroud)

名称绑定发生在呼叫范围,而不是里面的功能,所以__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        
Run Code Online (Sandbox Code Playgroud)

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