Módulo de recarga que proporciona NameError: el nombre 'reload' no está definido

162

Estoy tratando de volver a cargar un módulo que ya importé en Python 3. Sé que solo necesita importar una vez y ejecutar el importcomando nuevamente no hará nada.

Ejecutar reload(foo)es dar este error:

Traceback (most recent call last):
    File "(stdin)", line 1, in (module)
    ...
NameError: name 'reload' is not defined

¿Qué significa el error?

Precio de Lonnie
fuente

Respuestas:

239

reload está incorporado en Python 2, pero no en Python 3, por lo que se espera el error que está viendo.

Si realmente debe volver a cargar un módulo en Python 3, debe usar:

Alex Martelli
fuente
37
Esta respuesta hace que parezca que es malo volver a cargar un módulo en Python 3. ¿Cuál es el pensamiento detrás de esto?
ABM
11
La recarga siempre es problemática. La recarga de las variables del módulo de actualizaciones, pero no elimina las antiguas, por lo que si cambia el nombre de algo, el nombre anterior seguirá existiendo. Si cambia las definiciones de clase, los objetos existentes seguirán teniendo el tipo anterior. Finalmente, algunos módulos ejecutan código en el momento de la importación que no está diseñado para ejecutarse dos veces. Por lo tanto, es mejor evitar la recarga, pero con frecuencia es muy conveniente.
Evan
13
Yo diría que a menudo es problemático, pero no siempre . Sin duda, creo que los casos de uso válidos para escribir reloaden un guión son muy raros, y es poco probable que los que emplean ese tipo de arte oscuro estén leyendo este comentario. Sin embargo, si está desarrollando un módulo y está utilizando una consola IPython para probarlo de forma interactiva, reloadpuede ser útil en ese flujo de trabajo. Sin embargo, como dijo @Evan, tenga cuidado con los efectos secundarios del tiempo de importación. En general, diría que evite reloadusar los módulos de otra persona. reloadLo suyo tiene sentido durante el tiempo de diseño.
Tim D
66
Utilizo el cuaderno Jupyter para mi trabajo, y para mantener las cosas ordenadas, pongo el trabajo que debería requerir revisiones mínimas en los paquetes importables. Sin embargo, esas cosas a veces necesitan revisiones, y la recarga es absolutamente lo que se debe hacer, ya que el kernel de mi computadora portátil guarda cálculos de memoria que tomaron, literalmente, todo el día para computar.
Scott,
La recarga es vital para el desarrollo activo de bibliotecas con llamadas que requieren mucho tiempo, por ejemplo, funciones de base de datos. Sin embargo, uno de los principales problemas que puede encontrar al recargar los módulos es que las funciones con decoradores tenderán a no recargarse correctamente. Vea aquí
Alexander McFarlane,
82

Para> = Python3.4:

import importlib
importlib.reload(module)

Para <= Python3.3:

import imp
imp.reload(module)

Para Python2.x:

Use la reload()función incorporada .

reload(module)
Kevin
fuente
48
import imp
imp.reload(script4)

fuente
77
En desuso desde Python 3.4: use importliben su lugar.
Mark Amery
39

Para ampliar las respuestas escritas anteriormente, si desea una solución única que funcione en las versiones 2 y 3 de Python, puede usar lo siguiente:

try:
    reload  # Python 2.7
except NameError:
    try:
        from importlib import reload  # Python 3.4+
    except ImportError:
        from imp import reload  # Python 3.0 - 3.3
Joey Wilhelm
fuente
12

Recomiendo usar el siguiente fragmento, ya que funciona en todas las versiones de Python (requiere six):

from six.moves import reload_module
reload_module(module)
Alleo
fuente
2

Para compatibilidad con python2 y python3, puede usar:

# Python 2 and 3
from imp import reload
reload(mymodule)
Patrick José Pereira
fuente
1
Esto funciona en Python 3.7 (y versiones anteriores), pero se describe como @Alex Martelli escribió a continuación. Use la respuesta de Alleo 'from six.moves import reload_module'
Charles Plager
2

Si no desea utilizar libs externas, entonces una solución es recrear el método de recarga de python 2 para python 3 como se muestra a continuación. Use esto en la parte superior del módulo (supone python 3.4+).

import sys
if(sys.version_info.major>=3):
    def reload(MODULE):        
        import importlib
        importlib.reload(MODULE)

Por cierto, la recarga es muy necesaria si usa archivos de Python como archivos de configuración y desea evitar reinicios de la aplicación .....

usuario6830669
fuente