29 ноября 2015 г.

Функция 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)    # Принудительная загрузка/выполнение нового кода
<module ‘changer’ from ‘changer.py’>
>>> changer.printer()  # Теперь будет запущена новая версия
reloaded: After editing
Обратите внимание, что функция reload в действительности возвращает объект – обычно ее результат игнорируется, но поскольку интерактивная оболочка автоматически выводит результат выражения, интерпретатор вывел результат в виде строки <module ‘name’...>.


Комментариев нет:

Отправить комментарий