Написание моего первого модуля в 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 делает два шага:
- Во-первых, он проверяет, если модуль уже кэшируется в
sys.module
Словарь. - И только если это не Там он на самом деле импортирует модуль.
Это означает, что, если вы уже импортировали модуль (или импортируемый другой модуль, который ссылается на это), и вы пытаетесь еще раз импортировать, 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”