Сообщить об ошибке.

Функция reload() модуля importlib в Python

Перезагрузка импортированного модуля

Синтаксис:

import importlib

importlib.reload(module)

Параметры:

  • module - str, имя модуля.

Возвращаемое значение:

Описание:

Функция reload() модуля importlib перезагружает ранее импортированный модуль.

Аргумент module должен быть объектом модуля, поэтому он должен быть успешно импортирован ранее.

Функция importlib.reload() полезна, если вы отредактировали исходный файл модуля с помощью внешнего редактора и хотите опробовать новую версию, не выходя из интерпретатора Python.

Возвращаемое значение - это объект модуля, который может отличаться, если при повторном импорте в словарь sys.modules помещается другой объект.

В качестве примера посмотрите раздел "Как перезагрузить импортированный модуль".

Когда функция importlib.reload() выполняется:

  • Код модуля Python перекомпилируется и код уровня модуля выполняется повторно, определяя новый набор объектов, связанных с именами в словаре модуля, путем повторного использования загрузчика, который первоначально загрузил модуль. Функция init модулей расширения не вызывается во второй раз.
  • Как и со всеми другими объектами в Python, старые объекты восстанавливаются только после того, как их число ссылок упадет до нуля.
  • Имена в пространстве имен модуля обновляются, чтобы указывать на любые новые или измененные объекты.
  • Другие ссылки на старые объекты, например внешние имена по отношению к модулю не привязываются к новым объектам и должны обновляться в каждом пространстве имен, где они встречаются, если это необходимо.

Есть ряд других предостережений:

Когда модуль перезагружается, его словарь, содержащий глобальные переменные модуля сохраняется. Переопределения имен переменных, функций, классов и т.д. переопределят старые определения, так что это обычно не проблема. Но если в новой версии модуля нет имен переменных, функций, классов, которые были определены в старой версии, то старое определение остается...

Эта функция может быть использована в интересах модуля, если он поддерживает глобальную таблицу переменных или кэш объектов. С помощью оператора try ... except он может проверить наличие таблицы и при желании пропустить ее инициализацию:

try:
    cache
except NameError:
    cache = {}

Как правило, не очень полезно перезагружать встроенные или динамически загружаемые модули. Перезагрузка sys, __main__, builtins и других ключевых модулей не рекомендуется. Во многих случаях модули расширения не предназначены для инициализации более одного раза и могут произойти сбой произвольным образом при перезагрузке.

Если модуль импортирует объекты из другого модуля, используя from… import…, вызов importlib.reload() для другого модуля не переопределяет импортированные из него объекты - одним из способов является повторное выполнение оператора from, другим - использование import c уточнением имени: import module.name.

Если модуль создает экземпляры класса, перезагрузка модуля, который определяет класс, не влияет на определения методов экземпляров - они продолжают использовать старое определение класса. То же самое верно для производных классов.