Рубрики
Без рубрики

Автоматически перезагрузить модули Python с% AutoReload

Надоело перезагрузить модуль каждый раз, когда вы меняете это? % автозагрузки на помощь! Помечено с iPython, Python.

Написание моего первого модуля в Python был запутанным опытом. Как обычно происходит, когда я проверял его в Interactive Python REPL, первая версия получилась, чтобы иметь некоторые ошибки (второе и третье, которые также сделали 😉).

Это нормально – Я думал – Я просто испражу модуль и повторю его.

Но оказалось, что звонит От my_module Import my_function Не обновил код! my_function все еще имел ошибку, которую я только что исправлял! Я дважды проверил, если я изменил правильный файл, снова восстановил его и еще ничего. Оказывается, как Stackoverflow любезно объяснил , что вы не можете просто Reimport модуль. Если вы уже импортировали модуль ( Import a_module ) или функция ( от a_module import a_function ) на вашем сеансе Python, и вы пытаетесь еще раз импортировать, ничего не произойдет. Неважно, используете ли вы стандартный Python REFL или IPYTON.

Как импортирует в Python?

Оказывается, для причин эффективности, когда вы импортируете модуль в интерактивном сеансе Python, интерпретатор Python делает два шага:

  1. Во-первых, он проверяет, если модуль уже кэшируется в sys.module Словарь.
  2. И только если это не Там он на самом деле импортирует модуль.

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

Итак, если я не могу Reimport Модуль, это означает, что я должен перезапустить Python каждый раз? Не совсем, это было бы очень неудобно.

Как повторить модуль?

Самый простой способ – бросить ваше интерактивное сеанс и начать его снова. Он работает нормально, если вы не заботитесь о сохранении данных, которые у вас уже есть на вашем сеансе, например, функции, которые вы написали, и переменные, которые вы рассчитали. Но обычно вы не хотите перезапустить REFL, так что есть лучшие способы.

Так как мы знаем, что переводчик сначала будет искать модуль в Sys.modules Словарь, мы можем просто удалить наш модуль из этого словаря. И это будет работать в большинстве случаев, но есть некоторые предостережения. Если ваш модуль будет ссылаться с другого модуля, есть вероятность того, что вы все еще не сможете его повторно решить. Так что не делай этого. Существует лучший способ.

Рекомендуемое решение – использовать ImportLib.reload функция. Эта функция предназначена именно для революционных модулей, которые уже были импортированы ранее. Чтобы перезагрузить модуль, вам нужно запустить:

import importlib
importlib.reload(my_module)

Так вот так вы можете восстановить модуль в Python. И если вы не используете iPython, это где ваши опции заканчиваются. Но пользователи iPython имеют некоторые другие интересные решения этой проблемы.

%бегать

Если вам не волнует на самом деле «Импорт» Ваш модуль и все, что вам нужно, это запустить некоторые функции, определенные в файле, вы можете Выполнить этот файл вместо этого. Он запускает все команды, как если бы вы скопировали и вставьте их в сеанс iPython. Вы можете повторить файл столько раз, сколько вы хотите, и он всегда будет обновлять все функции. Запуск файла в iPython чрезвычайно прост:

%run my_file.py
# You can even skip the ".py" extension:
%run my_file

Я немного обманул, когда сказал, что этот вариант недоступен в стандартном Python REPL. Это, но это требует больше набора текста:

exec(open("./my_file.py").read())

Если честно, если бы мне пришлось напечатать все это, я мог бы также просто использовать ImportLib.reload вместо.

Все эти варианты великолепны, но если вы так же плохо, как я, когда дело доходит до написания кода, и вы делаете много ошибок, то это значит много перезагрузки. И набрав это importlib.reload.reload. / % беги / Экс ... раздражает. Не было бы здорово, если бы был способ автоматически перезагрузить модуль? Ну, iPython действительно может сделать это!

% автозагрузки на спасение

Другой из магических методов в iPython связан с модулями перезарядки. Это называется % автозагрузки Отказ Он не включен по умолчанию, поэтому вы должны загрузить его как расширение:

%load_ext autoreload

Теперь вы можете включить автоматическую перезагрузку:

%autoreload 2

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

Есть 3 параметра конфигурации, которые вы можете установить:

  • % автозагрузки 0 – отключает автоматическую перезагрузку. Это значение по умолчанию.
  • % автозагрузки 1 – Он будет только автоматически перезагрузки модули, которые были импортированы с использованием % AIMPORT Функция (например, % remport my_module ). Это хороший вариант, если вы хотите специально автоматически перезагрузить только выбранный модуль.
  • % автозагрузки 2 – Авто-перезагрузка всех модулей. Отличный способ сделать написание и тестирование ваших модулей намного проще.

Отлично, любые предостережения? Я нашел 3 несовершеннолетних:

  • IPython с включенным в% AutoReload будет слегка помедленнее. IPython довольно умный о том, что перезагрузить. Он проверит временные метки модулей модулей и сравнивают их со временем, когда они импортируются. Но эта проверка (и в конечном итоге ревортирование модифицированных модулей) все равно потребуется некоторое время. Это не будет так медленно, что вы почувствуете это (если у вас нет модулей, которые занимают секунды для импорта), но это, очевидно, будет работать быстрее, если вы отключите автоматическую перезагрузку.
  • Как указано в документации,% AutoReload не на 100% надежна, и может быть некоторое неожиданное поведение. Я никогда не замечал никаких проблем, но вы можете, поэтому я просто предупреждаю вас.
  • Вам необходимо убедиться, что у вас нет синтаксических ошибок в модулях, когда вы выполняете команды iPython. Я часто начинаю писать какой-нибудь код в файле и, в середине команды, я переключаюсь на iPython, чтобы быстро проверить что-то. И когда я выполняю какой-нибудь код в iPython, он попытается повторно повторить файл, который я просто изменил (тот, который с полуписной командой) и бросил синтаксирую. Хорошая вещь – после ошибки, вы все равно получите вывод команды, которую вы управляете. Так для меня это незначительное раздражение, а не настоящая проблема. Вы можете легко решить его, запустив два сеанса iPython – один для тестирования модуля (с включенным в% AutoReload), а другой для выполнения каких-либо случайных команд и поиск вещей в документации.

Вот как % автозагрузки Работает на практике:

Так что если вы не знаете % автозагрузки Тем не менее, дайте ему попробуйте в следующий раз, когда вы будете работать над модулем в Python!

Изображение из: Бессмысленно

Оригинал: “https://dev.to/switowski/automatically-reload-modules-with-autoreload-3g8b”