Вы можете перезагрузить модуль, когда он уже был импортирован, используя встроенную функцию reload
в Python 2:
import foo
while True:
# Do some things.
if is_changed(foo):
foo = reload(foo)
В Python 3, reload
был перемещен в модуль imp
. В 3.4 imp
устарели в пользу importlib
, а к последнему добавили reload
. При таргетинге 3 или более поздней версии либо ссылайтесь на соответствующий модуль при вызове reload
или импортируйте его.
Я думаю, что это то, что вы хотите. Веб-серверы, такие как сервер разработки Django, используют это, чтобы вы могли видеть эффекты изменений кода без перезапуска самого процесса сервера.
Чтобы процитировать из документов:
Python код модулей перекомпилирован, а код модуля-уровня повторно выполняется, определяя новый набор объектов, которые привязаны к именам в словаре модуля. Функция init модулей расширения не вызывается второй раз. Как и все другие объекты в Python, старые объекты восстанавливаются только после того, как их отсчеты ссылок упадут до нуля. Имена в пространстве имен модулей обновляются, чтобы указывать на любые новые или измененные объекты. Другие ссылки на старые объекты (например, имена, внешние по отношению к модулю) не отскакивают, чтобы ссылаться на новые объекты и должны обновляться в каждом пространстве имен, где они встречаются, если это необходимо.
blockquote>Как вы отметили в своем вопросе, вам придется восстановить объекты
Foo
, если классFoo
находится в модулеfoo
.