Ich habe in diese nützliche Frage und Antwort gesehen , dass man reload(whatever_module)
verwenden kann, oder in Python 3 imp.reload(whatever_module)
.
Meine Frage ist, was wäre, wenn ich from whatever_module import *
zum Importieren gesagt hätte? Dann kann ich mich nicht auf whatever_module
beziehen, wenn ich reload()
verwende. Wirst du mich anschreien, ein ganzes Modul in den globalen Namensraum zu werfen? :)
Ich stimme dem "mach das nicht allgemein" Konsens zu, aber ...
Die richtige Antwort ist:
import X
reload(X)
from X import Y # or * for that matter
Verwenden Sie niemals import *
; es zerstört die Lesbarkeit.
Beachten Sie auch, dass das Nachladen von Modulen fast nie sinnvoll ist. Sie können nicht vorhersagen, in welchem Zustand Ihr Programm nach dem Neuladen eines Moduls landen wird. Dies ist eine großartige Möglichkeit, um unverständliche, nicht nachvollziehbare Fehler zu erhalten.
EIN
from module import *
nimmt alle "exportierten" Objekte aus module
und bindet sie an Namen auf Modulebene (oder was auch immer Ihr Geltungsbereich war). Sie can laden das Modul neu als:
reload(sys.modules['module'])
aber das nützt dir nichts: Die Namen der Stufen, auf denen Sie sich gerade befinden, zeigen immer noch auf die alten Objekte.
Eine sauberere Antwort ist eine Mischung aus Catskuls guter Antwort und Ohad Cohens Verwendung von sys.module
und direkter Neudefinition:
import sys
Y = reload(sys.module["X"]).Y # reload() returns the new module
Tatsächlich erstellt import X
ein neues Symbol (X
), das im folgenden Code möglicherweise neu definiert wird. Dies ist nicht erforderlich (sys
ist zwar ein allgemeines Modul, daher sollte dies nicht passieren).
Der interessante Punkt hier ist, dass from X import Y
nicht X
zum Namespace hinzufügt, sondern das Modul X
zur Liste der bekannten Module (sys.modules
) hinzufügt, wodurch das Modul neu geladen werden kann (und auf dessen neuen Inhalt zugegriffen werden kann).
Allgemein gilt: Wenn mehrere importierte Symbole aktualisiert werden müssen, ist es sinnvoller, sie wie folgt zu importieren:
import sys
reload(sys.module["X"]) # No X symbol created!
from X import Y, Z, T
Beim Importieren mit from whatever_module import whatever
wird whatever
als Teil des importierenden Moduls gezählt. Um es erneut zu laden, sollten Sie Ihr Modul erneut laden. Wenn Sie Ihr Modul jedoch nur neu laden, erhalten Sie immer noch die alte whatever
- aus dem bereits importierten whatever_module
. Sie müssen also das Modul (what_module) neu laden und anschließend Ihr Modul erneut laden:
# reload(whatever_module), if you imported it
reload(sys.modules['whatever_module'])
reload(sys.modules[__name__])
wenn Sie from whatever_module import whatever
verwendet haben, können Sie dies auch berücksichtigen
whatever=reload(sys.modules['whatever_module']).whatever
oder
whatever=reload(whatever_module).whatever
import re
for mod in sys.modules.values():
if re.search('name', str(mod)):
reload(mod)
für Python 3.7:
from importlib import reload #import function "reload"
import YourModule #import your any modules
reload(YourModule) #reload your module
Die Reload-Funktion kann von Ihrer eigenen Funktion aus aufgerufen werden
def yourFunc():
reload(YourModule)