chorrada con carga de modulos
Gabriel Genellina
gagsl-py2 en yahoo.com.ar
Dom Sep 23 21:57:29 CEST 2007
En Fri, 21 Sep 2007 07:36:47 -0300, Cesar Ortiz <cesar en ortiz.name>
escribi�:
> Si tengo un modulo apps.py que tiene:
>
>
> import debug
> import apps
>
> def programBegin():
> debug.init()
Oops, apps se importa a sí mismo? Un poco raro... pero igual, no tiene
nada que ver con el problema.
> Y si tengo un modulo debug.py que tiene:
>
> DEBUG = 0
>
> def init():
> global DEBUG
> DEBUG=1
>
> if ( __name__ == "__main__") :
> import apps
> apps.programBegin()
> print DEBUG
> ¿Porque al ejecutar como comando el modulo debug.py, me imprime 0? Mi no
> entender...
La clave está en que al ejecutar debug.py directamente, se crean DOS
copias del MISMO modulo.
1) El script que estas ejecutando (debug.py) se carga como modulo
'__main__' (es decir, en sys.modules se inserta un nuevo item con
clave='__main__' y valor=el modulo debug.py).
2) Cuando apps ejecuta "import debug", Python se fija si el modulo ya esta
importado (mirando las claves de sys.modules) y como no lo encuentra, lo
lee de disco y lo inserta con clave='debug'
O sea que debug.py fue importado DOS veces. Cuando programBegin llama a
debug.init, lo que se modifica es el valor de la variable DEBUG que esta
en el modulo llamado "debug". Cuando haces el print estando dentro del
script principal (que coincide con debug.py) lo que estas imprimiendo es
la variable DEBUG que esta en el modulo llamado "__main__".
De paso, esta es justamente la razon por la que funciona la condicion:
if __name__ == "__main__":
que más de uno escribe sin tener ni idea de porqué se hace así.
--
Gabriel Genellina
------------ próxima parte ------------
_______________________________________________
Python-es mailing list
Python-es en aditel.org
http://listas.aditel.org/listinfo/python-es
Más información sobre la lista de distribución Python-es