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...

Driver L293D de Texas Instruments

El L293D de Texas Instruments es sin lugar a dudas un circuito integrado de un gran valor cuando necesitamos controlar motores de corriente continua o bipolares de pasos (Bipolar stepping motors) Es cierto que se trata de un puente en H (o medios puentes), en este caso cuádruple, que sin bien podríamos crearlo con transistores, el echo de que se encuentre integrado en un único chip es de agradecer. Capáz de conducir corrientes bidireccionales de hasta 1 amperio en el modelo L293 y hasta 600 mA en el modelo L293D y con tensiones que van desde los 4.5V hasta los 36V en ambos modelos. Por supuesto podemos utilizarlo en otras aplicaciones o para controlar otros componentes: motores de corriente continua, relés, motores de paso bipolares, solenoides en general y cualquier carga que requiera una alta corriente y tensión. Las entradas son de tipo TTL y se activan por parejas, es decir, desde la pata Enable 1,2EN, activamoslas entradas 1 y 2 y desde la pata Enable 3,4EN activamos la 3...

El Robin Hood de los procesos pobres (Vamos de escalada)

Pues sí, has leído bien, hoy nos vamos de escalada, pero ojo! No nos vamos a las montañas, nos vamos al interior, al kernel del sistema operativo Windows 10 en esta ocasión, aunque es aplicable a otras versiones con algunos mínimos cambios. Hoy la cosa va de EoP (Elevation of Privilege), escalada de privilegios en el sistema. Vamos a ver cómo hacer de Robin Hood para "mangarle" el “Access Token” al usuario "NT AUTHORITY\SYSTEM" a través de la estructura _EPROCESS del proceso “System” para dárselo al pobre CMD.EXE. ¿Con qué fin? Pues darle poder absoluto sobre el sistema a un usuario limitado, por ejemplo para que pueda utilizar la calculadora, o el notepad sin limitaciones :) Venga vale, que es broma, que en realidad será para utilizarlo en una shellcode y un driver de dispositivo firmado por alguien :) Antes  de  comenzar  hay  que  dejar  claro  que  vamos  a  necesitar  algunas herramientas para realizar este proce...