Как перезагрузить модуль python, импортированный с помощью " from module import *`
я видела в это полезный Q & A что можно использовать reload(whatever_module) или, в Python 3, imp.reload(whatever_module).
мой вопрос в том, что если бы я сказал from whatever_module import * импортировать? Тогда у меня нет whatever_module ссылаться, когда я использую reload(). Вы, ребята, собираетесь кричать на меня за то, что я бросил целый модуль в глобальное пространство имен? :)
6 ответов
Я согласен с "Не делайте этого вообще" консенсус, но...
правильный ответ:
import X
reload(X)
from X import Y # or * for that matter
никогда не используйте import *; Это разрушает читаемость.
также имейте в виду, что перезагрузка модулей почти никогда не бывает полезной. Вы не можете предсказать, в каком состоянии ваша программа окажется после перезагрузки модуля, поэтому это отличный способ получить непонятные, непродуктивные ошибки.
A
from module import *
принимает все "экспортированные" объекты из module и привязывает их к именам на уровне модуля (или независимо от того, что ваша область была уровнем). Вы можете перезагрузить модуль, как:
reload(sys.modules['module'])
но это не принесет вам никакой пользы: имена, независимо от того, какой уровень был у вас, все еще указывают на старые объекты.
при импорте с помощью from whatever_module import whatever, whatever считается частью модуля импорта, поэтому для его перезагрузки - вы должны перезагрузить свой модуль. Но просто перезагрузив свой модуль, вы все равно получите старый whatever - от уже-импортные whatever_module, поэтому вам нужно перезагрузить (whatever_module), а затем перезагрузить модуль:
# reload(whatever_module), if you imported it
reload(sys.modules['whatever_module'])
reload(sys.modules[__name__])
если вы используете from whatever_module import whatever вы также можете рассмотреть
whatever=reload(sys.modules['whatever_module']).whatever
или
whatever=reload(whatever_module).whatever
более чистый ответ-это сочетание хорошего ответа Catskul и использования Охад Коэн sys.module и прямое переопределение:
import sys
Y = reload(sys.module["X"]).Y # reload() returns the new module
в самом деле import X создает новый символ (X), который может быть переопределен в следующем коде, который не нужен (тогда как sys является общим модулем, поэтому этого не должно произойти).
интересным моментом здесь является то, что from X import Y не добавлять X в пространстве имен, но добавляет модуль X в список известных модулей (sys.modules), что позволяет перезагрузить модуль (и получить доступ к его новому содержимому).
в целом, если несколько импортированных символов необходимо обновить, то удобнее импортировать их следующим образом:
import sys
reload(sys.module["X"]) # No X symbol created!
from X import Y, Z, T