En muchos programas de python nos encontramos con que se hace uso de una variable especial llamada __name__ y que parece estar ahí como por arte de magia. Pues bien, dicha magia "existe" y es elpropio intérprete de Python el que se encarga de hacerla y de crear e inicializar la variable __name__ antes de ejecutar el código del programa.
El intérprete de python crea diversas variables "especiales" y, en el caso que nos ocupa de la variable __name__ la inicializa con el valor "__main__" cuando el script se ejecuta directamente. Sin embargo, si el script se importa desde otro módulo o script, la variable __name__ será inicializada por el intérprete para que contenga el nombre del módulo.
Nada mejor que un ejemplo práctico para entender el funcionamiento de la variable __name__ de python. En este sencillo script vamos a tener una función "Suma(op1, op2)" que sencillamente va a hacer la suma de los dos operandos que la pasamos como parámetros.
import sys def Suma(op1, op2): return op1 + op2 def main(argv): if len(argv) == 2: print "Resultado de la suma: " + str(Suma(int(argv[0]), int(argv[1]))) else: sys.exit(2) if __name__ == "__main__": main(sys.argv[1:])
Si nos fijamos, además de la función "Suma(op1, op2)", también he definido una función "main(argv)". Si ejecutamos este script directamente desde python, veremos que se va a ejecutar la función "main(argv)". Esto es así, gracias al condicional que aparece al final del script, el cual comprueba el valor de __name__ y si este es igual a "__main__", es decir, si el script se ha ejecutado directamente, entonces ejecutará la función "main(argv)". Veamos el resultado de la ejecución de este script:
C:\Python27>python test.py 4 3
Resultado de la suma: 7
Resultado de la suma: 7
Esto está muy bien, porque nos permite ejecutar el script directamente pero además, poder importarlo desde otro script para hacer uso de la función "Suma(op1, op2)". En este caso lo que no nos interesará es que se ejecute la función "main(argv)", si no tan solo poder utilizar la función "Suma(op1, op2)", haciendo de esta manera un uso del script o módulo como si de una biblioteca de funciones se tratará. Esta vez vamos a hacer uso del módulo directamente desde el propio intérprete de Python:
C:\Python27>python
Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import test
>>> test.Suma(4, 3)
7
Type "help", "copyright", "credits" or "license" for more information.
>>> import test
>>> test.Suma(4, 3)
7
Como podemos observar, en esta ocasión hemos importado el módulo cuyo nombre es "test" y, hemos llamado a la función suma, pasándola como parámetros el 4 y el 3 y, obviamente obteniendo la suma de ambos como resultado. Además, si nos fijamos en el la salida, no se ha ejecutado la función "main(argv)".
Vamos a utilizar el modulo "test" importándolo desde otro script de python y además, vamos a consultar el valor de la variable __name__ para que veamos como el intérprete de python la inicializa para que contenga el nombre del módulo.
import test if __name__ == '__main__': print 'Resultado de la suma: ' + str(test.Suma(4, 3)) print 'Valor de __name__ para el script actual: ' + __name__ print 'Valor de __name__ para el modulo importado: ' + test.__name__Ejecutemos este script y veamos el resultado:
C:\Python27>python script2.py
Resultado de la suma: 7
Valor de __name__ para el script actual: __main__
Valor de __name__ para el modulo importado: test
Resultado de la suma: 7
Valor de __name__ para el script actual: __main__
Valor de __name__ para el modulo importado: test
Y esto es todo, ahora ya sabeis que se puede escribir scripts de python para que sean ejecutados directamente, o para ser utilizados como módulos importables desde otros scripts, pudiendo decidir gracias a la variables __name__, que parte del código del módulo queremos que se ejecute cuando se utiliza como script independiente ó dicho de otra forma, que parte de código no queremos que sea ejecutado cuando se utiliza como módulo importable.
Comentarios
Publicar un comentario