Приведем более конкретный пример использования функции 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’...>.
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’...>.
Комментариев нет:
Отправить комментарий