__import__
is a low-level hook function that's used to import modules; it can be used to import a module dynamically by giving the module name to import as a variable, something the import
statement won't let you do.
importlib.import_module()
is a wrapper around that hook* to produce a nice API for the functionality; it is a very recent addition to Python 2, and has been more fleshed out in Python 3. Codebases that use __import__
generally do so because they want to remain compatible with older Python 2 releases, e.g. anything before Python 2.7.
One side-effect of using __import__
can be that it returns the imported module and doesn't add anything to the namespace; you can import with it without having then to delete the new name if you didn't want that new name; using import somename
will add somename
to your namespace, but __import__('somename')
instead returns the imported module, which you can then ignore. Werkzeug uses the hook for that reason in one location.
All other uses are to do with dynamic imports. Werkzeug supports Python 2.6 still so cannot use importlib
.
* importlib
is a Pure-Python implementation, and import_module()
will use that implementation, whist __import__
will use a C-optimised version. Both versions call back to importlib._bootstrap._find_and_load()
so the difference is mostly academic.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…