Пропустить до содержимого

Как использовать/исправить модуль reload в Python

[

Перезагрузка модуля Python

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

Давайте посмотрим на пример файла mod.py:

s = "Компьютеры бесполезны. Они могут только дать вам ответы."
a = [100, 200, 300]
def printy(arg):
print(f'arg = {arg}')
class Classy:
pass
print(f'a = {a}')

При импорте модуля получим следующий результат:

>>> import mod
a = [100, 200, 300]
>>> import mod
>>> import mod
>>> mod.a
[100, 200, 300]
>>> mod.s
'Компьютеры бесполезны. Они могут только дать вам ответы.'

Как видно из примера, оператор print() не выполняется при последующих импортах модуля. (К слову, также не выполняется оператор присваивания, но, как показывает последний вывод значения mod.a, это не имеет значения. Как только присваивание выполнено, результат сохраняется.)

Если внесены изменения в модуль и требуется его перезагрузка, вам необходимо либо перезапустить интерпретатор, либо использовать функцию reload() из модуля importlib. Без выхода из REPL изменяем mod.py следующим образом:

s = "Компьютеры бесполезны. Они могут только дать вам ответы."
a = [100, 200, 300]
def printy(arg):
print(f'arg = {arg}')
class Classy:
pass
print(f'a is equal {a}')

Далее импортируем модуль заново:

>>> import mod
>>> exit()

Ничего не происходит, изменения файла не отображаются. Затем перезапускаем REPL и импортируем модуль снова:

>>> import mod
a is equal [100, 200, 300]
>>> import mod
>>> import importlib
>>> importlib.reload(mod)
a is equal [100, 200, 300]

В этом видео я покажу вам, как перезагружать модуль. До сих пор вы просто импортировали модуль один раз. Даже если бы вы попытались импортировать его снова, модуль загружается только один раз за сеанс интерпретатора, и это работает отлично для функций и определений классов и для импорта всех этих объектов в начале. Однако иногда модули могут содержать также исполняющие операторы. Обычно исполняющие операторы используются только для инициализации, и имеет смысл выполнять их только при первом импорте модуля. В большинстве случаев это удобно.

Если изменения в модуле вам действительно нужны, то есть два варианта. Во-первых, вы можете перезапустить интерпретатор, что вы уже много раз практиковали. Во-вторых, существует модуль importlib, и в нем есть функция reload(). Позвольте мне показать вам, как это выглядит.

Один из вариантов - перезапустить интерпретатор, что вы уже много раз делали, выходите и снова запускаете его. Но иногда вам может понадобиться перезагрузка модуля, особенно если вы изменили код и не хотите перезапускать интерпретатор. Например, вы внесли небольшие изменения и сохранели файл, и теперь вы хотите импортировать mod - все объекты по-прежнему доступны, и повторный импорт mod ничего не выводит.

Если вам нужны эти изменения, вы можете выйти и перезапустить интерпретатор. И если вы выполните импорт, вы увидите изменения. Но если вы снова импортируете mod - он не выполнит код повторно. Он уже был импортирован.

Есть один инструмент, который вы можете использовать вместо этого. Этот инструмент доступен в модуле importlib. Внутри importlib есть функция reload().

Если вы хотите перезагрузить модуль, импортируемый в mod, вы можете просто написать: importlib.reload(mod). Тогда модуль будет перезагружен.

Это удобный инструмент, который можно использовать, если вносятся изменения в ваш модуль.

В следующем видео вы узнаете о пакетах Python.