webentwicklung-frage-antwort-db.com.de

So laden Sie das mit `from module import *` importierte Python-Modul neu

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? :)

39
murftown

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
43
Catskul

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.

8
Allen

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.

3
tzot

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
1
Eric O Lebigot

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
0
Ohad Cohen
import re

for mod in sys.modules.values():
    if re.search('name', str(mod)):
        reload(mod)
0
jennifer

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)
0
Veniamin Magnet