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

Author: Community, 2011-04-01

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
 41
Author: Catskul,
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.

 8
Author: Allen,
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.

 3
Author: tzot,
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
 0
Author: Ohad Cohen,
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
 0
Author: Eric Lebigot,
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)
 -1
Author: jennifer,
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