2

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

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

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

import mymodule
from myothermodule import spam, ham

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

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

4

1 回答 1

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从堆栈中弹出模块并将其绑定到本地名称。您可以看到两个片段之间的唯一区别是模块存储到哪个名称。

于 2012-06-29T13:52:55.687 回答