IMPORT VS__IMPORT__()VS IMPORTLIB.IMPORT_MODULE()?
问题描述
我注意到Flask正在使用Werkzeug__import__
一个模块,我有点困惑。我查看了它上的文档,发现它似乎在某种程度上让您在查找模块的位置方面有了更多的控制权,但我不确定确切地如何,我也完全不知道它与importlib.import_module
有什么不同。
Werkzeug示例中的奇怪之处在于它只表示__import__(import_name)
,所以我看不出这与只使用import
语句有什么不同,因为它忽略了可选的额外参数。
有谁能解释一下吗?我看了看其他人以前也问过类似的问题,但他们的问题措辞不是很清楚,答案完全没有涉及到这个问题。
解决方案
__import__
是一个用于导入模块的低级钩子函数;它可以用于通过指定要作为变量导入的模块名称来动态导入模块,这是import
语句所不允许的。
importlib.import_module()
是对挂钩进行包装,以便为该功能生成一个不错的API;它是最近添加到Python2中的,并在Python3中得到了更丰富的内容。使用的代码库通常这样做是因为它们希望保持与较旧的Python2版本(例如,任何早于Python2.7的版本)的兼容性。
使用__import__
的一个副作用可能是它返回导入的模块,并且不会向名称空间添加任何内容;如果您不想要新名称,则可以使用它进行导入,而不必删除新名称;使用somename
会将somename
添加到名称空间,但是__import__('somename')
返回导入的模块,然后您可以忽略该模块。Werkzeug为此在一个位置使用挂钩。
所有其他用途都与动态导入有关。Werkzeug仍然支持Python2.6,因此无法使用importlib
。
*importlib
是一个纯Python实现,import_module()
将使用该实现,而__import__
将使用C优化版本。这两个版本都回调到importlib._bootstrap._find_and_load()
,因此差异主要是学术上的。
相关文章