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

WinRT with C++ Standard vs C++/CX

OFFTOPIC: Nota: Hoy he decidido escribir esta publicación del blog en inglés. Note: Today I decided to write this blog post in English. In a new application than I am developing for a company, I had to decide if to make use of C++/CX (C++ with Component Extension) or make all the main stuff in C++ standard and ABI/COM. All of you than have had to work with COM (Component Object Model) and fighting with the interfaces, reference count, etc. known the tricky and heavy that it can become. As an example of the easy approach using C++/CX, I am creating a new Uri object, like this: auto uriEasyWay = ref new Windows::Foundation:: Uri ( http://www.manuelvillasur.com ); assert (wcscmp(uriEasyWay->AbsoluteUri->Data(), L"http://www.manuelvillasur.com/" ) == 0); Now, I going to show you the more difficult approach using C++ Standard and  ABI/COM interfaces: HSTRING_HEADER header = {}; HSTRING string = nullptr ; HRESULT hr = WindowsCreateStringRefer

Árbol binario de expresión y Notación Posfija (II)

En una publicación anterior, hablaba sobre que es la notación posfija, para que puede ser útil y mostraba un pequeño ejemplo con una expresión aritmética simple: (9 - (5 + 2)) * 3 Pues bien, hoy voy a mostraros como podemos crear el árbol binario correspondiente para analizar o evaluar esta expresión, haciendo uso del recorrido en postorden. Lo primero que debemos hacer es crear el árbol, respetando las siguientes reglas: ⦁ Los nodos con hijos (padres) representarán los operadores de la expresión. ⦁ Las hojas (terminales sin hijos) representarán los operandos. ⦁ Los paréntesis generan sub-árboles. A continuación podemos ver cómo queda el árbol para la expresión del ejemplo (9 - (5 + 2)) * 3: Si queremos obtener la notación postfija a partir de este árbol de expresión, debemos recorrerlo en postorden (nodo izquierdo – nodo derecho – nodo central), obteniendo la expresión: 952+-3x Así, si quisiéramos evaluar la expresión, podemos hacer uso de un algoritmo