Modul zum erneuten Laden mit NameError: Der Name 'reload' ist nicht definiert

162

Ich versuche, ein Modul neu zu laden, das ich bereits in Python 3 importiert habe. Ich weiß, dass Sie es nur einmal importieren müssen und die importerneute Ausführung des Befehls nichts bewirkt.

Das Ausführen reload(foo)gibt diesen Fehler aus:

Traceback (most recent call last):
    File "(stdin)", line 1, in (module)
    ...
NameError: name 'reload' is not defined

Was bedeutet der Fehler?

Lonnie Price
quelle

Antworten:

239

reload ist in Python 2 integriert, jedoch nicht in Python 3, sodass der angezeigte Fehler erwartet wird.

Wenn Sie ein Modul in Python 3 wirklich neu laden müssen, sollten Sie Folgendes verwenden:

Alex Martelli
quelle
37
Diese Antwort klingt so, als wäre es schlecht, ein Modul in Python 3 neu zu laden. Was steckt dahinter?
ABM
11
Das Nachladen ist immer problematisch. Durch das erneute Laden werden Modulvariablen aktualisiert, alte jedoch nicht entfernt. Wenn Sie also etwas umbenennen, bleibt der alte Name bestehen. Wenn Sie Klassendefinitionen ändern, haben vorhandene Objekte weiterhin den alten Typ. Schließlich führen einige Module zum Zeitpunkt des Imports Code aus, der nicht zweimal ausgeführt werden soll. Es ist also besser, ein Nachladen zu vermeiden, aber häufig sehr praktisch.
Evan
13
Ich würde sagen, dass es oft problematisch ist, aber nicht immer . Natürlich denke ich, dass die gültigen Anwendungsfälle für das Schreiben reloadin ein Skript in der Tat sehr selten sind, und diejenigen, die diese Art von dunkler Kunst verwenden, werden diesen Kommentar wahrscheinlich nicht lesen. Wenn Sie jedoch ein Modul entwickeln und es interaktiv mit einer IPython-Konsole testen, reloadkann dies in diesem Arbeitsablauf hilfreich sein. Achten Sie jedoch, wie @Evan sagte, auf Nebenwirkungen beim Import. Im Allgemeinen würde ich sagen, dass reloadSie die Module anderer vermeiden sollten . reloadWährend der Entwurfszeit ist es sinnvoll, eigene Daten zu erstellen.
Tim D
6
Ich verwende Jupyter-Notizbuch für meine Arbeit, und um Ordnung zu schaffen, habe ich Arbeiten, die nur minimale Überarbeitungen erfordern, in importierbare Pakete eingefügt. Diese Dinge müssen jedoch manchmal überarbeitet werden, und das Neuladen ist absolut richtig, da mein Notebook-Kernel Speicherberechnungen enthält, deren Berechnung buchstäblich den ganzen Tag in Anspruch nahm.
Scott
Das Neuladen ist für die aktive Entwicklung von Bibliotheken mit zeitaufwändigen Aufrufen, z. B. Datenbankfunktionen, von entscheidender Bedeutung. Eines der Hauptprobleme beim Neuladen von Modulen ist jedoch, dass Funktionen mit Dekorateuren in der Regel nicht richtig neu geladen werden (siehe hier
Alexander McFarlane,