Архив метки: функция reload

Функция reload, углубляемся, примеры

Приведем более конкретный пример использования функции reload. В следующем примере мы изменяем и повторно загружаем файл модуля без остановки интерактивного сеанса работы с интерпретатором Python. Повторная  загрузка  может  использоваться  в  различных случаях  , но мы рассмотрим лишь самый простой пример. Во-первых, в текстовом редакторе создайте файл модуля с именем changer.py и добавьте в него следующее содержимое:


message = “First version”
def printer():
    print(message)
Этот модуль создает и экспортирует два имени – одно связано со строкой, а другое является функцией. Теперь запустите интерпретатор Python, импортируйте модуль и вызовите функцию, которую он экспортирует. Функция выведет
значение глобальной переменной message:
% python
>>> import changer
>>> changer.printer()
First version
Не закрывая интерактивную оболочку интерпретатора, отредактируйте файл модуля в другом окне:
…измените файл changer.py, не останавливая интерактивный сеанс…
% vi changer.py
Измените глобальную переменную message, а также тело функции printer:
message = “After editing”
def printer():
    print(‘reloaded:’, message)
Затем вернитесь в окно интерактивной оболочки и перезагрузите модуль, что-
бы выполнить обновленный программный код. Обратите внимание: в следую-
щем листинге видно, что операция импортирования модуля не дает желаемого 
результата – на экран выводится первоначальный текст сообщения, несмотря 
на то, что файл был изменен. Чтобы задействовать новую версию, необходимо 
вызвать функцию reload:
…вернитесь обратно в интерактивную оболочку… 
>>> import changer
>>> changer.printer()  # Никакого эффекта: используется прежняя версия модуля
First version
>>> from imp import reload
>>> reload(changer)    # Принудительная загрузка/выполнение нового кода

>>> changer.printer()  # Теперь будет запущена новая версия
reloaded: After editing
Обратите внимание, что функция reload в действительности возвращает объект – обычно ее результат игнорируется, но поскольку интерактивная оболочка автоматически выводит результат выражения, интерпретатор вывел результат в виде строки .

Автор: Няшный Человек
Дата публикации: 2015-11-29T12:13:00.001+02:00

Основы использования функции reload

В отличие от инструкций import и from:
•  reload – это не инструкция, а функция.
•  Функции reload передается существующий объект модуля, а не имя.
•  В Python 3.0 функции reload находится в модуле imp, который требуется импортировать, чтобы получить доступ к функции. Функция reload ожидает получить объект, поэтому к моменту ее вызова модуль уже должен быть успешно импортирован (если операция импорта оказалась неудачной из-за синтаксических или каких-либо других ошибок, вам может потребоваться повторить ее, прежде чем можно будет повторно загрузить модуль).

Кроме того, синтаксис инструкции import и функции reload отличается: аргумент должен передаваться функции reload в круглых скобках, а инструкции import – без них. Повторная загрузка модуля выполняется примерно следующим образом:
import module                  # Первоначальное импортирование
…используются атрибуты модуля…
…                            # Теперь выполняются изменения в файле модуля

from imp import reload         # Импортировать функцию reload (в 3.0)
reload(module)                 # Загрузить обновленный модуль
…используются атрибуты модуля…
Это типичный случай, когда вы импортируете модуль, затем изменяете исходный программный код в текстовом редакторе, а потом повторно загружаете его. Когда вы вызываете функцию reload, интерпретатор повторно читает файл с  исходными  текстами  и  выполняет  инструкции,  находящиеся  на  верхнем уровне. Пожалуй, самое важное, что следует знать о функции reload, – это то, что она изменяет непосредственно сам объект модуля – она не удаляет и не создает его повторно. Вследствие этого все ссылки на объект модуля, имеющиеся в программе, автоматически будут учитывать изменения, произошедшие в результате повторной загрузки. А теперь подробнее о том, как происходит повторная загрузка:
•  Функция reload запускает новый программный код в файле модуля в текущем пространстве имен модуля. При повторном выполнении программный код перезаписывает существующее пространство имен вместо того, чтобы удалять его и создавать вновь.
•  Инструкции присваивания на верхнем уровне файла замещают имена новыми значениями. Например, повторный запуск инструкции def приводит к замещению предыдущей версии функции в пространстве имен модуля, выполняя повторную операцию присваивания имени функции.
•  Повторная загрузка оказывает воздействие на всех клиентов, использовавших инструкцию import для получения доступа к модулю. Клиенты, использовавшие инструкцию import, получают доступ к атрибутам модуля, указывая полные их имена, поэтому после повторной загрузки они будут получать новые значения атрибутов.
•  Повторная загрузка будет воздействовать лишь на тех клиентов, которые еще только будут использовать инструкцию from в будущем. Клиенты, которые использовали инструкцию from для получения доступа к атрибутам в прошлом, не заметят изменений, произошедших в результате повторной загрузки, – они по-прежнему будут ссылаться на старые объекты, полученные до выполнения перезагрузки.

Автор: Няшный Человек
Дата публикации: 2015-11-21T16:54:00.000+02:00