NameError: el nombre 'recargar' no está definido

81

Estoy usando Python 3.2.2. Cuando escribo un programa simple, encuentro el problema.

>>> reload(recommendations)
Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    reload(recommendations)
NameError: name 'reload' is not defined

¿Cómo debería hacerlo?

MindHacks
fuente
9
Probablemente no sea necesario un "programa simple" reload.
Wooble
Quiero usar "recargar (recomendaciones)", "recomendaciones.abc ()". Pero no puede encontrar recomendaciones
MindHacks
1
@MindHacks Si no ha importado las recomendaciones, no las recarga, las importa. import recommendations. ¿Por qué pensaste que necesitabas usar reload()?
Gareth Latty
@geoffspear La mayoría de los "programas simples" que leen archivos con caracteres no latinos lo necesitan reload, desafortunadamente.
caballero
@GennaroTedesco: si estás pensando en algo horrible que leíste que involucre recargar (sys), nunca lo hagas. Solo hazlo with open('file', 'r', encoding='utf-8') as f: do_whatever. No hay absolutamente ninguna necesidad de recargar () módulos en programas simples, o realmente en cualquier programa de Python.
Wooble

Respuestas:

158

Probablemente querías importlib.reload().

from importlib import reload

En Python 2.x, esto era incorporado , pero en 3.x, está en el importlibmódulo.

Tenga en cuenta que el uso reload()fuera del intérprete generalmente es innecesario, ¿qué estaba tratando de hacer aquí?

Gareth Latty
fuente
Gracias, funciona. Pero si quiero usar la recarga, ¿debo importar el archivo cada vez?
MindHacks
@MindHacks: ¿De qué "archivo" estás hablando?
Sven Marnach
@MindHacks: impes un módulo, no un archivo. (Está integrado en el núcleo del intérprete y no corresponde a ningún archivo). Y sí, para usarlo imp.reloadtienes que importar imp, pero eso no es gran cosa.
Sven Marnach
@MindHacks Necesitas importar impdonde lo uses reload(), sí. Así es como funciona el espacio de nombres. ¿Por qué querría volver a cargar un módulo fuera del indicador interactivo de todos modos?
Gareth Latty
3
Gracias, pero suspiro. ¿Por qué no intentan hacer que el caparazón sea más útil?
Thomas Ahle
12

Una actualización de la respuesta de @Gareth Latty. impse depreció en Python 3.4. Ahora quieres importlib.reload().

from importlib import reload
James Hirschorn
fuente
11

Prueba importlib.reload.

Recargue un módulo previamente importado. El argumento debe ser un objeto de módulo, por lo que debe haberse importado correctamente antes. Esto es útil si ha editado el archivo fuente del módulo con un editor externo y desea probar la nueva versión sin salir del intérprete de Python.

from importlib import reload

reload(module_name)
Biplab Malakar
fuente
0

Como han dicho otros, es necesario importlib.reload(module)o en algún momento anterior es necesario from importlib import reload. Pero puede ocultarlo from importlib import reloaden un archivo de inicialización. Asegúrese de que PYTHONSTARTUPesté definido en su shell. Por ejemplo,

export PYTHONSTARTUP=$HOME/python/startup.py

Podría ser una línea razonable para agregar a su ~/.bash_profile, si su shell es bash, y dependiendo de dónde almacene sus archivos de Python. (Si sigue estas instrucciones, inicie una nueva ventana de terminal en este punto para que se ejecute la línea). Luego, puede poner la línea

from importlib import reload

en ~/python/startup.pyy sucederá automáticamente. (Nuevamente, si está siguiendo, comience una nueva sesión de Python en este punto). Esto puede parecer un poco complejo solo para resolver este problema, pero es algo que solo tiene que hacer una vez, y luego para cada problema similar en la línea de "Ojalá Python siempre hiciera esto", una vez que encuentre la solución, puede ponerla ~/python/startup.pyy olvidarse de ella.

Adam Chalcraft
fuente