python - reglas - Módulo recursivo de importación y recarga.
recursividad implementacion (2)
python hello.py
(A) ejecuta el código una vez, cuando (A) las llamadas import hello
el código se ejecuta nuevamente (B), cuando (A) y (B) reload(hello)
llamadas reload(hello)
, el código se ejecuta dos veces más, para cuatro veces en total.
En general, durante la vida útil de un programa, el código de un módulo se ejecutará en los siguientes momentos:
- Una vez si es el módulo principal.
- Cuando se importa por primera vez por cualquier módulo (incluido él mismo)
- En cualquier momento se llama a
reload()
en el módulo.
En cuanto a por qué el reload()
no se llama recursivamente, hay un punto de salida temprano a la función PyImport_ReloadModule () (CPython, el archivo es import.c) para evitar esto:
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
Alguien puede explicar por qué ejecutando el siguiente código:
archivo " hello.py ":
import hello
print "hello"
hello = reload(hello)
ejecutando como python hello.py
imprime lo siguiente?
hello
hello
hello
hello
¿Por qué 4 veces? Sé que cuando un módulo ya está importado, no se vuelve a importar, pero recargar las fuerzas para volver a cargar un módulo, incluso si ya está cargado. Habría esperado como resultado impresiones de ''hola'' sin límite.
¿Qué tiene que pasar para que la reload
no recargue un módulo?
reload
mantiene una lista (en realidad un dictado) de los módulos que está recargando actualmente para evitar la recursividad de los módulos.
Consulte http://hg.python.org/cpython/file/e6b8202443b6/Lib/imp.py#l236
Esto no está documentado, como tal, pero creo que probablemente pueda confiar en que siga siendo así.