Рекурсивный модуль импорта и перезагрузки - программирование
Подтвердить что ты не робот

Рекурсивный модуль импорта и перезагрузки

Может кто-нибудь объяснить, почему выполняется следующий код:

file " hello.py":

import hello
print "hello"
hello = reload(hello)

выполняется как python hello.py печатает следующие данные:

hello
hello
hello
hello

Почему 4 раза? Я знаю, что когда модуль уже импортирован, он снова не импортируется, но перезагружает силы для перезагрузки модуля, даже если он уже загружен. Я бы ожидал, что в результате отмените "привет" отпечатки.

Что должно произойти, поэтому reload не перезагрузит модуль?

4b9b3361

Ответ 1

python hello.py (A) запускает код один раз, когда (A) вызывает import hello, код запускается снова (B), когда (A) и (B) вызывают reload(hello), код запускается еще дважды, в четыре раза больше.

В общем, для времени жизни программы код модуля будет выполняться в следующие моменты времени:

  • Если это основной модуль
  • Когда он импортирует первый время любым модулем (включая себя)
  • Любое время reload() вызывается в модуле

Что касается того, почему reload() не называется рекурсивно, есть ранняя точка выхода для функции PyImport_ReloadModule() (CPython, файл - import.c), чтобы предотвратить это:

http://svn.python.org/view/python/trunk/Python/import.c?view=markup#l2646

    ...
    existing_m = PyDict_GetItemString(modules_reloading, name);
    if (existing_m != NULL) {
        /* Due to a recursive reload, this module is already
           being reloaded. */
        Py_INCREF(existing_m);
        return existing_m;
    }
    ... load module code is below here

Ответ 2

reload хранит список (на самом деле dict) модулей, которые он в настоящее время перезагружает, чтобы не перезагружать модули рекурсивно.

См. http://hg.python.org/cpython/file/e6b8202443b6/Lib/imp.py#l236

Это не документировано, как таковое, но я думаю, что вы, вероятно, полагаетесь на это, оставаясь в стороне.