Python 从哪里导入别名?
Python允许导入的别名,通过import语句中的Python 从哪里导入别名?,python,import,alias,Python,Import,Alias,Python允许导入的别名,通过import语句中的…作为子句,如下所示: import mymodule as somealias from myothermodule import spam as spamalias, ham as hamalias 现在,至少在默认情况下,import语句,包括那些具有as-子句的语句(如上面的语句),会导致调用\uuuuuuuuu builtin\uuuuuu.\uuuuuuuuu import\uuuuu,其参数列表不包括此类别名的名称。下面的“无别
…作为
子句,如下所示:
import mymodule as somealias
from myothermodule import spam as spamalias, ham as hamalias
现在,至少在默认情况下,import语句,包括那些具有as
-子句的语句(如上面的语句),会导致调用\uuuuuuuuu builtin\uuuuuu.\uuuuuuuuu import\uuuuu
,其参数列表不包括此类别名的名称。下面的“无别名”导入语句与上面引用的导入语句生成对\uuuuuuu内置\uuuuuu.\uuuuuu导入\uuuuu
的相同调用:
import mymodule
from myothermodule import spam, ham
那么这些别名是如何进入导入过程的呢?Python是否提供了自定义导入过程如何使用别名的方法
(我没有考虑任何特定的应用程序;我只是想更好地理解Python是如何工作的。)函数
\uuu import\uu()
不绑定调用范围中的任何名称。基本上
import foo
类似于
foo = __import__("foo")
bar = __import__("foo")
及
类似于
foo = __import__("foo")
bar = __import__("foo")
名称绑定发生在调用作用域中,而不是函数内部,因此\uuuu import\uuuu()
不需要知道模块最终将绑定到哪个名称
这也可以从以下语句的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\u NAME
opcode隐式调用\uuu IMPORT\uu()
,并将生成的模块留在内部堆栈上。随后的STORE\u NAME
从堆栈中弹出模块并将其绑定到本地名称。您可以看到这两个代码段之间的唯一区别是模块存储到哪个名称。答案很好,而且速度非常快。我会尽快接受的,让我来吧。谢谢