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