La variable __name__

Un fichero conteniendo código Python se puede ejecutar en dos escenarios distintos: cuando lo cargamos, por ejemplo, en Jupyter y lo ejecutamos (es decir, cuando es nuestro fichero principal), y cuando se importa como librería (es decir, cuando no es nuestro fichero principal).

En cualquiera de los dos casos, hay una variable especial -asociada a cada uno de los ficheros con los que estemos trabajando- denominada __name__ que recibe un valor que depende de si el fichero en cuestión se ha ejecutado como programa principal o si se ha importado. Si se ha ejecutado como programa principal dicha variable tomará el valor de texto "__main__", y si se ha ejecutado al ser importado como librería recibirá el nombre que tenga dicha librería.

Para ver esto en funcionamiento vamos a crear un fichero Python que vamos a leer desde Visual Studio Code (o desde algún IDE semejante), fichero al que vamos a llamar "fichero1.py". El contenido de este fichero va a ser simplemente:

print("fichero1:", __name__)

Si ejecutamos el fichero obtenemos como única salida la siguiente:

fichero1: __main__

La variable __name__

Esto es así pues nuestro código es el programa principal y, por lo tanto, la variable __name__ recibirá el texto "__main__" tal y como se ha comentado.

Ahora creemos un segundo fichero, de nombre fichero2.py que contenga código semejante al anterior:

print("fichero2:", __name__)

Si lo ejecutamos, volvemos a obtener un resultado equivalente:

fichero2: __main__

Nuevamente, la variable __name__ ha recibido como valor el texto "__main__" y el motivo es por haber ejecutado este fichero como programa principal.

Ahora bien ¿qué se mostraría en pantalla si desde el fichero 1 importamos el fichero 2 como librería? Veámoslo. Ahora el código del primer fichero es:

import fichero2

print("fichero1:", __name__)

(se supone que ambos ficheros se encuentran en la misma carpeta)

La ejecución del código devuelve el siguiente resultado:

fichero2: fichero2
fichero1: __main__

La variable __name__

Para entender el motivo conviene analizar el orden de ejecución del código:

  1. En primer lugar se importa la librería "fichero2", lo que provoca la ejecución del print que hay en dicha librería. Como ese fichero se está importando como librería (no es nuestro programa principal) la variable __name__ recibe como valor el nombre de la librería: "fichero2", y esto es lo que se imprime.
  2. A continuación se ejecuta el print de nuestro fichero principal. En este caso la variable __name__ ha recibido el valor __main__ (por tratarse del fichero principal), que es lo que vemos en pantalla.