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!