Jak przeładować zaimportowany moduł Pythona za pomocą ' from module import *`
Widziałem w to przydatne Q&A , które można użyć reload(whatever_module)
lub, w Pythonie 3, imp.reload(whatever_module)
.
Moje pytanie brzmi, co gdybym powiedział from whatever_module import *
importować? Wtedy nie mam whatever_module
do którego mogę się odnieść, gdy używam reload()
. Będziecie na mnie wrzeszczeć za wrzucenie całego modułu do globalnej przestrzeni nazw? :)
6 answers
Zgadzam się z"nie rób tego ogólnie" konsensusu, ale...
Prawidłowa odpowiedź brzmi:
import X
reload(X)
from X import Y # or * for that matter
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-01 16:02:54
Nigdy nie używaj import *
; niszczy czytelność.
Należy również pamiętać, że przeładowywanie modułów prawie nigdy nie jest przydatne. Nie możesz przewidzieć, w jakim stanie skończy się twój program po przeładowaniu modułu, więc jest to świetny sposób na uzyskanie niezrozumiałych, nieprodukowalnych błędów.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-01 17:42:29
A
from module import *
Pobiera wszystkie "wyeksportowane" obiekty z module
i wiąże je z nazwami na poziomie modułu (lub innymi nazwami na poziomie Twojego zakresu). Możesz przeładować moduł jako:
reload(sys.modules['module'])
Ale to nie przyniesie ci nic dobrego: niezależnie od tego, jaki był twój zakres, nazwy nadal wskazują na stare obiekty.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-10 17:46:05
Podczas importowania za pomocą from whatever_module import whatever
, whatever
jest liczony jako część modułu importującego, więc aby go przeładować - powinieneś przeładować swój moduł. Ale po przeładowaniu modułu nadal otrzymasz stary whatever
- z już zaimportowanego whatever_module
, więc musisz przeładować (whatever_module), a następnie przeładować swój moduł:
# reload(whatever_module), if you imported it
reload(sys.modules['whatever_module'])
reload(sys.modules[__name__])
Jeśli użyłeś from whatever_module import whatever
Możesz również rozważyć
whatever=reload(sys.modules['whatever_module']).whatever
Lub
whatever=reload(whatever_module).whatever
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-18 22:15:25
Odpowiedź jest mieszanką dobrej odpowiedzi Catskula i OHADA Cohena z użyciem sys.module
i bezpośredniej redefinicji:
import sys
Y = reload(sys.module["X"]).Y # reload() returns the new module
W rzeczywistości, robienie import X
tworzy nowy symbol (X
), który może być ponownie zdefiniowany w kodzie, który następuje, co jest niepotrzebne (podczas gdy sys
jest wspólnym modułem, więc tak się nie powinno stać).
Ciekawostką jest to, że from X import Y
nie dodaje X
do przestrzeni nazw, ale dodaje Moduł X
do listy znanych modułów (sys.modules
), dzięki czemu moduł może być reloaded (i dostęp do nowej zawartości).
Bardziej ogólnie, jeśli wiele zaimportowanych symboli wymaga aktualizacji, wygodniej jest zaimportować je w następujący sposób:
import sys
reload(sys.module["X"]) # No X symbol created!
from X import Y, Z, T
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-01 16:26:28
import re
for mod in sys.modules.values():
if re.search('name', str(mod)):
reload(mod)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-06 06:25:27