2012-05-01 23 views
9
$ python 
>>> import myapp 
>>> reload(myapp) 
<module 'myapp' from 'myapp.pyc'> 
>>> 

ctrl + Den Python intérprete

$ python 
>>> from myapp import * 
>>> reload(myapp) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'myapp' is not defined 

¿Por qué este se comporta de manera diferente? ¿Cómo puedo volver a cargar cuando uso from myapp import *?

+0

La razón por la que utilizo * reload() * es porque modifico el código fuente del módulo y lo pruebo y el motivo por el que uso * de myapp import * es porque me ahorra tipeo. – xralf

+1

'reload' se debe usar con un * lote * de precaución. Se comporta inesperadamente de muchas maneras, la peor de las cuales es que existen clases en muchas versiones dentro de la máquina virtual, dependiendo de si tiene viejas instancias de clases cargadas. 'reload' se eliminó de Python 3 por ese motivo. A menudo es mucho más fácil configurar un pequeño script para configurar todos los módulos que necesita y luego colocarlo en un shell usando 'import code; code.interact (local = locals()) '.El intérprete de Python se inicia muy rápido, por lo que suele ser incluso más rápido que buscar 'reload' en el historial de readline. –

+0

@NiklasB. Gracias por los consejos, pero no puedo imaginar esto sin algún ejemplo. Si es posible y tiene tiempo para escribir más sobre esto, por favor ponga un ejemplo a la respuesta. O puedo crear una nueva pregunta basada en tu comentario, si no estás en contra. – xralf

Respuesta

17

De http://docs.python.org/library/functions.html#reload:

Si un módulo importa objetos desde otro módulo mediante la importación de ... ..., llamando recarga() para el otro módulo no redefinir los objetos importados de ella - Una forma de evitar esto es volver a ejecutar la declaración de from, otra es usar nombres de importación y calificados (módulo nombre) en su lugar.

Por lo tanto, usted debe hacer algo como:

from myapp import * 
.... 
import myapp 
reload(myapp) 
from myapp import * 
2

¿Cómo puedo volver a cargar cuando uso from myapp import *?

No puede. Esta es una de las razones por las que usar from X import * es una mala idea.

+2

No es una mala idea cuando se depura. Ahorra tipeo. – xralf

3

Con from myapp import *, que no tienen una referencia a su módulo en un nombre de variable, por lo que no puede utilizar un nombre de variable para hacer referencia al módulo.

Por supuesto, no hay nada que le impida importar de nuevo para obtener la referencia al módulo en un nombre que puede utilizar. Puesto que ya se haya importado una vez, no va a ser importado en realidad una vez más:

import myapp 
reload(myapp) 

también se puede obtener la referencia directamente de sys.modules.

import sys 
reload(sys.modules["myapp]") 
+0

Importar y volver a cargar el módulo no vinculará de nuevo ningún nombre que esté enlazado con 'from foo import *'. Esto puede o no hacer inútil la recarga. – geoffspear

+0

La razón por la que utilizo * reload() * es porque modifico el código fuente del módulo y lo pruebo, y el motivo por el que uso * de la importación de myapp * es porque me ahorra tipeo. – xralf

1

Para aclarar el comentario de Wooble, usando "de importación foo *" trae todo de foo en el espacio de nombres actual. Esto puede llevar a colisiones de nombres (donde involuntariamente se le asigna un nuevo valor a un nombre que ya está en uso) y también puede hacer que sea más difícil decir de dónde vino algo. Si bien algunas bibliotecas a menudo se usan de esta manera, generalmente causa más problemas de los que vale.

Además, dado que se ha introducido en el espacio de nombre actual, no se puede volver a cargar. En general, es mejor mantenerlo en un espacio de nombres separado (tal vez con un alias de conveniencia más corto como solo m). Esto le permite recargar (lo que es útil para probar, pero rara vez es una buena idea fuera de las pruebas) y ayuda a mantener puro el espacio de nombres.

Cuestiones relacionadas