2015-01-30 15 views
20

Ich bemerkte Flask verwendete Werkzeug zu __import__ ein Modul, und ich war ein wenig verwirrt. Ich ging und überprüfte die Docs darauf und sah, dass es Ihnen irgendwie mehr Kontrolle in Bezug darauf gibt, wo es für das Modul aussieht, aber ich bin mir nicht sicher genau wie und ich habe keine Ahnung, wie es anders ist als importlib.import_module .import vs __import __() vs importlib.import_module()?

Das Seltsame im Werkzeug Beispiel ist, dass es nur sagt __import__(import_name), so sehe ich nicht, wie das ist etwas anderes jeder aus nur die import Anweisung, da sie die optionalen zusätzlichen Parameter ignoriert wird.

Kann mir jemand erklären? Ich schaute auf andere Leute, die ähnliche Fragen zu SO gestellt hatten, aber sie waren nicht sehr klar formulierte Fragen und die Antworten behandelten das überhaupt nicht.

+1

Verwenden '__import__' wo' Sie ein Modul, dessen Namen importieren möchten nur bei runtime' bekannt ist. Anderes als das...Wie Sie sagten, gibt dies Ihre mehr Macht im Vergleich zum Import –

+0

Wenn Speicher ordnungsgemäß verwendet wird, gibt es ein David Beasely Video beim Import, in dem Video erwähnt er, dass WerkZeug Import aus irgendeinem Grund überladen. – Carel

Antwort

34

__import__ ist eine Low-Level-Hook-Funktion, die zum Importieren von Modulen verwendet wird; Es kann verwendet werden, um ein Modul dynamisch zu importieren, indem Sie den Modulnamen als Variable zu importieren, etwas, was die import-Anweisung nicht tun wird.

importlib.import_module() ist ein Wrapper um diesen Haken *, um eine nette API für die Funktionalität zu erzeugen; es ist eine sehr neue Ergänzung zu Python 2 und wurde in Python 3 genauer ausgearbeitet. Codebasen, die __import__ verwenden, tun dies im Allgemeinen, weil sie mit älteren Python 2-Versionen kompatibel bleiben wollen, z. alles vor Python 2.7.

Ein Nebeneffekt der Verwendung von __import__ kann sein, dass es das importierte Modul zurückgibt und dem Namespace nichts hinzufügt; Sie können damit importieren, ohne dann den neuen Namen zu löschen, wenn Sie diesen neuen Namen nicht möchten; Wenn Sie import somename verwenden, wird somename zu Ihrem Namensraum hinzugefügt, aber __import__('somename') gibt stattdessen das importierte Modul zurück, das Sie dann ignorieren können. Werkzeug nutzt den Haken deshalb an einem Ort.

Alle anderen Anwendungen haben mit dynamischen Importen zu tun. Werkzeug unterstützt Python 2.6 immer noch so kann importlib nicht verwenden.


*importlib ist eine Pure-Python-Implementierung, und import_module() wird, dass die Umsetzung verwenden, Whist __import__ eine C-optimierte Version verwenden. Beide Versionen rufen zurück zu , so dass der Unterschied meist akademisch ist.

+0

Ich verstehe nicht ganz, was Sie meinen, "Sie können damit importieren, ohne dann den neuen Namen zu löschen, wenn Sie diesen neuen Namen nicht wollten." Wenn du eine Minute Zeit hast, könntest du das vielleicht so ausdrücken, als würdest du mit einem Kleinkind reden? – Aerovistae

+0

@Aerovistae: aktualisiert, dass ein wenig; 'import sys' fügt Ihrem Namespace den Namen' sys' hinzu (an das Modul gebunden), '_import __ ('sys')' gibt das 'sys'-Modulobjekt an den Aufrufer zurück, der dann dieses Objekt ignorieren kann. –

+0

@MartijnPieters Mit Namensraum meinst du 'sys.modules'? – NeoWang

3

__import__(import_name), so sehe ich nicht, wie Sie das von anders ist nur die Anweisung Import mit

Sowohl __import__() und importlib.import_module() erlauben es, ein Modul zu importieren, wenn Sie das Modul haben Name als Zeichenfolge Sie können nicht schreiben:

x = 're' 
import x 

oder Sie erhalten:

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