__name__ en Python es una variable que puedes encontrar en muchos códigos hechos por la comunidad cuando estás comenzando a programar con Python. Esta variable se utiliza mucho para replicar la función main que otros lenguajes de programación como C, C+ o Java utilizan para iniciar la ejecución del programa.
En C++ el código comienza a ejecutarse a partir de la función main…
#include
using namespace std;
int main()
{
cout << "Hello World!";
return 0;
}
En python se genera el mismo comportamiento de la siguiente forma:
def main():
print("Hello World!")
if __name__== "__main__":
main()
¿Esto por qué funciona?
- Cuando Python lee un archivo con código ejecuta TODO lo que se encuentra en el archivo.
- Cuando ejecutamos un archivo de Python directamente, sólo ese archivo genera una variable __name__ con el valor “__main__“
Todos los archivos que forman parte del programa ejecutado tienen declarada una variable __name__ por defecto pero su valor es distinto dependiendo de cómo ejecutemos el programa, por ejemplo…
Si ejecutamos un script directamente:
> python script.py
Todo el código escrito en ese archivo puede acceder a la variable __name__ que tendrá de valor “__main__” debido a que lo ejecutamos directamente.
En cambio si dentro del archivo script.py importamos otro archivo llamado libreria.py la variable __name__ tendrá el valor “libreria” ya que es el nombre del script.
# En libreria.py
print(__name__)
# En script.py
import libreria
# > python script.py
libreria
Si corremos el archivo script.py imprimirá en pantalla “libreria“, ya que al hacer la importación ejecuta todo el código del archivo importado e imprimirá la variable __name__, al ser una ejecución indirecta no se asigna el valor “__main__“.
Si te interesa puedes conocer la información directamente desde su documentación oficial: link.
Conclusión
Podemos usar la variable __name__ para crear comportamiento diferente en nuestros programas a partir de la forma en que se está ejecutando.
Una de las razones para hacerlo es que, a veces, se escribe un módulo (un archivo .py) que se puede ejecutar directamente, pero que alternativamente, también se puede importar y reutilizar sus funciones, clases, métodos, etc en otro módulo.
Con esto conseguimos que la ejecución sea diferente al ejecutar el módulo directamente que al importarlo desde otro programa.