обзор
August 13, 2021

Перезагрузка модулей в Python, которая помогает избежать головной боли

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

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

Рассмотрим простенький питоновский скрипт reload.py, который запускает функцию из другого модуля:

а вот содержимое imported.py:

Результатом исполнения reload.py будет:

Если вы захотите изменить функцию my_print:

и повторно запустить функцию или весь модуль, получите следующий вывод:

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

Избежать этого помогает использование функции для перезагрузки модулей reload (from importlib import reload). Однако для ее применения потребуется импортировать весь модуль и функцию вызывать как объект модуля (а не сразу импортировать функцию):

Аналогичные возможности по перезагрузке модулей предоставляются и через магические команды в Ipython. Так, расширение autoreload перезагружает модуль автоматически до выполнения кода. Для его применения требуется набрать две магические команды:

%load_ext autoreload
%autoreload 2

Запустим ноутбук:

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