繁体   English   中英

import 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__代码__import__通常这样做是因为它们希望与旧版本的Python 2兼容,例如Python 2.7之前的任何版本。

使用__import__一个副作用是它返回导入的模块,并且不向名称空间添加任何内容。 如果您不想使用新名称,可以直接导入,而不必删除新名称; 使用import somename将为您的命名空间添加somename ,但是__import__('somename')会返回导入的模块,您可以忽略该模块。 因此,Werkzeug在一个位置使用挂钩。

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


* importlib是纯Python实现, import_module()将使用该实现,而__import__将使用C优化版本。 这两个版本都调用importlib._bootstrap._find_and_load()因此差异主要是学术上的。

__import__(import_name) ,所以我看不到与仅使用import语句有什么不同

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

x = 're'
import x

否则您会得到:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM