21 ноября 2015 г.

Основы использования функции 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 для получения доступа к атрибутам в прошлом, не заметят изменений, произошедших в результате повторной загрузки, – они по-прежнему будут ссылаться на старые объекты, полученные до выполнения перезагрузки.


2 комментария:

  1. я всё таки не понял как использовать функцию reload

    ОтветитьУдалить
  2. вот мой код
    from tkinter import*
    from importlib import reload
    count = 0
    def click():
    global count
    count +=1
    b1.config(text = 'Нажатий - ' + str(count))

    sec = 0
    def start():
    global sec
    b1["state"] = "normal"
    sec += 1
    if sec < 10:
    root.after(1000, start)
    t1.config(text = str(sec))
    else:
    b1["state"] = "disable"
    t1.config(text = "За "+str(sec)+" секунд "+str(count)+" нажатий" )

    root=Tk()
    root.geometry("150x120")

    t1 = Label(root, text ='Нажмите старт для начала')
    t1.pack()

    b1 = Button(root, text ='ЖМИ', command=click)
    b1.pack()
    b1["state"] = "disable"

    b2 = Button(root, text ='старт', command=start)
    b2.pack()

    b3 = Button(root, text ='Заново', command=reload)

    b3.pack()


    root.mainloop(

    ОтветитьУдалить