¿Qué hace ‘if __name__ == “__main__”:’ en Python?

Seguramente has visto, e incluso utilizado, esta línea de código más de una vez:

...
if __name__ == '__main__':
    ...

Pero, ¿sabes lo que hace y por qué está ahí? Te lo explico.


Cada vez que el intérprete de Python lee código fuente de un archivo, ejecuta todo el código dentro de ese archivo. Incluso, cuando solo está importando una librería.

Sin embargo, hay ocasiones en las que no queremos ejecutar todo el código de un archivo y simplemente queremos importar alguna clase o función. Para evitar esta situación, el intérprete de Python pone a tu disposición la variable __name__.

Esta variable suele contener los siguientes valores:

  • __main__: si este módulo se está ejecutando como el programa principal
  • Nombre del archivo: si, por ejemplo, tu archivo se llama modulo.py y lo importas, el valor será modulo.
  • __console__: en casos excepcionales. Por ejemplo, en Django, cuando el módulo se ejecuta como parte de los comandos de este framework. No estoy seguro de si es un uso habitual.

Vamos a ver un ejemplo para dejarlo todo claro.

Ejemplo.py

Vamos a el siguiente código como ejemplo. Supongamos que el siguiente archivo ejemplo.py:

# ejemplo.py

print("crea la funcion 1")
def funcion1():
    print("ejecuta la funcion 1")

print("crea la funcion 2")
def funcion2():
    print("ejecuta la funcion 2")

print("antes de comprobar __name__")
if __name__ == '__main__':
    funcion1()
    funcion2()
print("despues del bloque __name__")

Variables especiales

Vamos a ver el contenido de __name__ dependiendo de la forma en la que se ejecute el módulo ejemplo.py

Cuando tu módulo es el programa principal

Si ejecutas tu módulo como el programa principal, algo así:

python foo.py

El intérprete asignará el valor __main__ a la variable __name__. Exactamente igual que si la primera línea de código de tu archivo fuese:

__name__ = "__main__"

¿Qué sucede si ejecutas el archivo? Deberías recibir los siguientes mensajes:

%> python ejemplo.py
// crea la funcion 1 (no la ejecuta)
crea la funcion 1
// crea la funcion 2 (no la ejecuta)
crea la funcion 2

antes de comprobar __name__

// como es el programa principal
// __name__ == "__main__" es true
// por tanto, ejecuta ambas funciones
ejecutando la funcion 1
ejecutando la funcion 2

// para acabar
despues del bloque __name__

Cuando tu módulo es importado por otro

Supongamos que ejemplo.py no es el módulo principal, si no que es importado desde otro módulo. Por ejemplo, si lo importamos desde la consola de Python:

%> python

>>> import ejemplo

El intérprete buscará tu archivo ejemplo.py y antes de ejecutar tu módulo, asignará el valor ejemplo a la variable __name__ igual que si se ejecutase la siguiente línea al comienzo de tu archivo:

__name__ = "ejemplo"

¿Qué sucede a continuación? Lo siguiente:

%> python
>>> import ejemplo
// crea la funcion 1 (no la ejecuta)
crea la funcion 1
// crea la funcion 2 (no la ejecuta)
crea la funcion 2

antes de comprobar __name__

// como no es el programa principal
// __name__ == "__main__" es false
// por tanto, las funciones no se ejecutan
// para acabar
despues del bloque __name__

En resumen…

Puedes utilizar if __name__ == '__main__': para proteger parte del código. De esta forma, puedes estar seguro de que ese bloque solo se ejecutará si tu módulo es el programa principal.

¿Por qué funciona de esta forma?

Hay ocasiones en las que quieres escribir un módulo de Python que pueda ser importado por otros programas y que pueda ser utilizado como el programa principal. Por ejemplo:

  • Tu módulo es una librería pero si se ejecuta directamente ejecuta tests o una demostración.
  • Tu módulo es normalmente el programa principal pero hay clases o funciones interesantes que podrían ser utilizados de forma externa.

Espero haber aclarado algunas dudas. Si tienes más preguntas, deja un comentario o búscame en Twitter. ¡Saludos!

Publicado por AlvaroLab

Enamorado de la gastronomía en todas sus facetas: la cocina, sus ingredientes, la agricultura, la nutrición y los restaurantes; diferentes países, culturas, tradiciones y costumbres.

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios .

A %d blogueros les gusta esto: