导入 vs __import__( ) vs importlib.import_module( )?

import vs __import__( ) vs importlib.import_module( )?

我注意到 Flask 正在使用 Werkzeug 来 __import__ 一个模块,我有点困惑。我去查看了它的文档,发现它似乎在寻找模块的位置方面以某种方式给了你更多的控制权,但我不确定究竟如何和我完全不知道它与 importlib.import_module.

有何不同

Werkzeug 示例中的奇怪之处在于它只是说 __import__(import_name),所以我看不出这与仅使用 import 语句有什么不同,因为它忽略了可选的额外参数.

谁能解释一下?我看过其他人之前在 SO 上问过类似的问题,但他们的问题措辞不是很清楚,答案根本没有解决这个问题。

__import__ 是用于导入模块的低级钩子函数;它可以用来动态导入模块,方法是将模块名称作为变量导入,import 语句不允许您这样做。

importlib.import_module() 是围绕该钩子的包装器 * 以产生一个很好的 API 功能;它是 Python 2 的最新补充,并且在 Python 3 中更加充实。使用 __import__ 的代码库通常这样做是因为它们希望与旧的 [=42] 保持兼容=] 2 个版本,例如Python 2.7.

之前的任何内容

使用 __import__ 的一个副作用可能是它 returns 导入的模块并且不会向命名空间添加任何内容;如果您不想要新名称,则可以使用它导入而不必删除新名称;使用 import somename 会将 somename 添加到您的命名空间,但 __import__('somename') 而不是 returns 导入的模块,然后您可以忽略它。出于这个原因,Werkzeug 在一个位置使用了钩子。

所有其他用途都与动态导入有关。 Werkzeug 仍然支持 Python 2.6,所以不能使用 importlib.


* importlib 是 Pure-Python 实现,import_module() 将使用该实现,whist __import__ 将使用 C 优化版本。两个版本都回调 importlib._bootstrap._find_and_load(),所以差异主要是学术上的。

__import__(import_name), so I don't see how that's any different from just using the import statement

当模块名称为字符串时,__import__() 和 importlib.import_module() 都允许您导入模块。你不能写:

x = 're'
import x

或者你会得到:

 File "1.py", line 3, in <module>
 import x ImportError: No module named x