函数说明
注意:这是一个高级函数,不像importlib.import_模块,不需要在每天的Python编程中使用。
该函数被import语句调用,为了改变import语句的语义,它可以被替换(通过导入内建模块并指派为builtins.__import__)。但强烈不建议这么做,因为使用import可以更容易达成目的,并且不会引起代码问题。同样不建议直接使用__import__(),赞成使用importlib.import_module()。
参数解释
该函数导入模块name,实际上是使用给定的globals和locals变量来决定如何在一个包上下文中解析name。fromlist给出对象或子模块名,即应该根据给定名称而导入的模块名。标准的启用中根本不会使用它的locals 参数,并且它的globals只是用来决定import语句的包上下文。
level指定是否使用绝对或相对导入,0(默认)表示只执行绝对导入,level正值表示需要搜索调用模块目录相关的父目录的数量。
当name变量是package.module形式时,通常返回顶层包(模块名上询至第一个点),而不是由name命名的模块。然而,当给定非空fromlist参数时,都会返回name命名的模块。
例如:import spam语句所产生的字节码类似于下面的代码:
spam = __import__('spam', globals(), locals(), [], 0)
import spam.ham语句产生这种调用:
spam = __import__('spam.ham', globals(), locals(), [], 0)
注意:在这里__import__()返回顶层模块的方式,是因为它是一个通过import语句绑定到name的对象。
另一方面,from spam.ham import eggs, sausage as saus语句会产生:
_temp = __import__('spam.ham', globals(), locals(), ['eggs', 'sausage'], 0)
eggs = _temp.eggs
saus = _temp.sausage
这里,__import__()返回spam.ham模块,根据这个模块对象,对导入的名称进行检索并分派给它们各自的名称。
如果你只想通过名称导入一个模块,使用importlib.import_module()。
版本变更
version 3.3变更: 不再支持level负值,现已修改默认值为0。