Ir al contenido principal

Variable especial __name__ de Python

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


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


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


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

Entradas populares de este blog

Como usar el TL431 (muy facil)

En este artículo, no vamos a entrar en el funcionamiento interno de este IC, ni tampoco en sus características técnicas, puesto que para esos fines ya existe su hoja de datos correspondiente. Más bien, lo que pretendo aquí es dejar constancia de como podemos utilizar este IC desde un punto de vista práctico, útil y sobre todo de una manera sencilla, con el objetivo de que cualquiera pueda utilizarlo. Si has llegado hasta aquí, probablemente ya sabes que por internet hay mucha información sobre este IC, pero también bastante confusa o excesivamente técnica, sin mostrar tan siquiera un ejemplo de funcionamiento, o como calcular sus pasivos. Pues se acabó, a partir de hoy y después de leer este post, ya te quedará claro como utilizar el TL431 para obtener una tensión de referencia estable y precisa. Vamos al grano y que mejor que empezar aclarando que el TL431 NO ES EXACTAMENTE UN ZENER como se empeñan en decir en muchos sitios, es verdad que se le conoce como el Zener Progra

Expresión Regular para números en Notación Científica (1.5e-10)

No cabe duda que las expresiones regulares tienen un potencial de mucho valor a la hora de analizar textos, ya sea para marcado, búsqueda de patrones, o incluso la programación de un compilador, un analizador de frases, de expresiones matemáticas, etc.   En esta ocasión he tenido que echar mano de ellas para el análisis de textos matemáticos en los cuales aparecen números en Notación Científica (con exponentes del tipo 1.5E-10). Pues bien, una expresión regular que me está funcionando bastante bien es la siguiente:   [-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?    Esta expresión regular se puede descomponer en los siguientes bloques, para poder interpretarla con mayor facilidad:  El primer bloque [-+]? está indicando que el número podría estar precedido opcionalmente de un signo - o un signo + El segundo bloque [0-9]* indica que podría aparecer un número de 0 o más dígitos del 0 al 9  El tercer bloque indica que también de manera opcional podría aparecer un pun

Programadores de Malware ¿Malas prácticas?

Cuando uno se enfrenta al análisis de un nuevo malware, son muchos los frentes que podemos abrir y los enfoques que podemos darle. Como es lógico, un primer paso será identificar que es un malware de aquello que no lo es, y en ocasiones esto es preciso hacerlo con la mayor rapidez posible. Muchas veces no contamos con el tiempo necesario para hacer un análisis completo a priori, y lo único que necesitamos es tomar decisiones tempranas para iniciar todos los protocolos oportunos ante una nueva muestra "maléfica". Parece lógico pensar, que un código que inicialmente está ofuscado, empaquetado, o que hace uso de determinadas APIs del sistema, ya tiene una cierta probabilidad de ser malware y por lo tanto empezar a tratarlo de manera especial. Durante estos días he estado analizando un nuevo malware, posiblemente una variante de tantas que andan circulando en estos días por internet. En concreto, lo que tengo entre manos es un Ransomware, si compañeros, un especimen