import importlib importlib.reload(module)
module
- str
, имя модуля.Функция reload()
модуля importlib
перезагружает ранее импортированный модуль.
Аргумент module
должен быть объектом модуля, поэтому он должен быть успешно импортирован ранее.
Функция importlib.reload()
полезна, если вы отредактировали исходный файл модуля с помощью внешнего редактора и хотите опробовать новую версию, не выходя из интерпретатора Python.
Возвращаемое значение - это объект модуля, который может отличаться, если при повторном импорте в словарь sys.modules
помещается другой объект.
В качестве примера посмотрите раздел "Как перезагрузить импортированный модуль".
Когда функция importlib.reload()
выполняется:
init
модулей расширения не вызывается во второй раз.Есть ряд других предостережений:
Когда модуль перезагружается, его словарь, содержащий глобальные переменные модуля сохраняется. Переопределения имен переменных, функций, классов и т.д. переопределят старые определения, так что это обычно не проблема. Но если в новой версии модуля нет имен переменных, функций, классов, которые были определены в старой версии, то старое определение остается...
Эта функция может быть использована в интересах модуля, если он поддерживает глобальную таблицу переменных или кэш объектов. С помощью оператора try ... except
он может проверить наличие таблицы и при желании пропустить ее инициализацию:
try: cache except NameError: cache = {}
Как правило, не очень полезно перезагружать встроенные или динамически загружаемые модули. Перезагрузка sys
, __main__
, builtins
и других ключевых модулей не рекомендуется. Во многих случаях модули расширения не предназначены для инициализации более одного раза и могут произойти сбой произвольным образом при перезагрузке.
Если модуль импортирует объекты из другого модуля, используя from… import…
, вызов importlib.reload()
для другого модуля не переопределяет импортированные из него объекты - одним из способов является повторное выполнение оператора from
, другим - использование import
c уточнением имени: import module.name
.
Если модуль создает экземпляры класса, перезагрузка модуля, который определяет класс, не влияет на определения методов экземпляров - они продолжают использовать старое определение класса. То же самое верно для производных классов.