arrow_back Volver
Inicio keyboard_arrow_right Artículos keyboard_arrow_right Artículo

if__name__ == '__main__'

Eduardo Ismael Garcia

Full Stack Developer at Código Facilito.

av_timer 3 Min. de lectura

remove_red_eye 14128 visitas

calendar_today 09 Abril 2020

Cuando comenzamos en el desarrollo Python es indudable que, tarde o temprano nos encontraremos con la siguiente condición:

if __name__ == '__main__':

Condición la cual me atrevo a decir que muy probablemente hayas utilizado sin sabe,r a ciencia cierta, cual era su propósito. Es por ello que en esta ocasión me gustaría explicarte cómo funciona exactamente esta condición y el por que deberías utilizarla en todos tus proyectos.

Bien, sin más dilación comencemos.

Condición

Comencemos desde lo más sencillo. Como sabemos, la forma más sencilla de persistir nuestro código Python es almacenarlo en archivos con extensión .py, archivos que posteriormente podremos modificar y por supuesto, ejecutar. A estos archivo los conoceremos como módulo.

Los módulo pueden ser tan sencillos o complejos como los deseemos. Por ejemplo, examinemos el siguiente script (codigofacilito.py)

print('Hola, me encuentro desde el archivo codigofacilito.py')

Una módulo sumamente sencillo, el cual si ejecutamos directamente desde la terminal podremos visualizar nuestro mensaje.

$ python codigofacilito.py 
Hola, me encuentro desde el archivo codigofacilito.py

Hasta aquí nada nuevo, sin embargo ¿Qué pasa si importamos el módulo? ?Veamos, utilicemos el shell de Python.

>>> import codigofacilito
Hola, me encuentro desde el archivo codigofacilito.py

En este caso al importar el módulo se estará imprimiendo, de forma automática, nuestro mensaje ¿A qué se debe esto? ?‍♀ Bien, deja te explico; Esto se debe, principalmente al funcionamiento del intérprete de Python, cuando el intérprete lee un archivo .py (un módulo) ejecutará todo el código global que se encuentre dentro de él, tal y como pudimos observar.

Se entiende como código global a todo aquel código que no se encuentre dentro de una función, método o clase.

Lo interesante de todo esto es que el intérprete asigna un atributo a cada uno de los módulos ejecutados, esto con el fin identificar, de forma única, al módulo en el sistema de importaciones. El atributo tiene por nombre __name__.

Por default, el valor del atributo __name__ será el nombre del archivo mismo, claro, sin su extensión.

>>> codigofacilito.__name__
'codigofacilito'

Sin embargo este nombre va a cambiar cuando el módulo se ejecute como el programa principal, es decir cuando archivo se ejecuta con el intérprete.

python codigofacilito.py

En ese caso el intérprete asigna al atributo __name__ el valor de 'main'. indicando que ese es el archivo principal, archivo que se encuentra en el top de ejecución.

Con esto en mente, podemos concluir que la condición if __name__ == '__name___' nos permite conocer si el módulo ha sido ejecutado directamente o ha sido importado. En caso el archivo se haya ejecutado como el archivo principal se procede a ejecutar todo el código dentro de la condición.

Si modificamos nuestro script y colocamos la condició, tendremos una salida completamente diferente.

if __name__ == '__main__':
    print('Hola, me encuentro desde el archivo codigofacilito.py')

Si ejecutamos el módulo como el archivo principal, se mostrará en consola el mensaje.

$ python codigofacilito.py 
Hola, me encuentro desde el archivo codigofacilito.py

Por otro lado, si importamos no deberíamos visualizar ningún mensajes, ya que hemos indicado que todo lo que se encuentre dentro de la condición (el código global) se ejecutará, sí y solo sí, el archivo es ejecutado como el archivo principal.

>>> import codigofacilito

La condición es muy útil cuando no conocemos, a ciencia cierta, si el módulo podrá, o no, ser utilizado por otros. En esos casos, para evitar cualquier problema, lo mejor que podemos hacer es simplemente condicionar.

(codigofacilito.py)

def saludar():
    print("Hola mundo desde el archivo codigofacilito.py")

if __name__ == '__main__':
    saludar()
>>> import codigofacilito
>>> codigofacilito.__name__ 
codigofacilto

# La función se ejecuta hasta que es llamada
# Y no cuando el módulo es importado
>>> codigofacilito.saludar()
Hola mundo desde el archivo codigofacilito.py"