Programa
El bloque condicional que empieza por if __name__ == "__main__"
aparece a menudo en el código Python. Esta línea puede parecer críptica, y muchos principiantes la utilizan sin saber qué hace o si deberían utilizarla. Los programadores que vienen de otros lenguajes también pueden malinterpretar y utilizar en exceso esta expresión.
Este tutorial se sumerge en el significado de la expresión if__name__ == "__main__"
de Python y explora cómo y cuándo utilizarlo.
Conviértete en Ingeniero de Datos
Comprender __name__
y "__main__"
La expresión if __name__ == "__main__"
es una sentencia if
que comprueba la igualdad.
El primer operando a la izquierda del operador de igualdad ==
es el atributo __name__
. Los nombres Python con doble guión bajo inicial y final son identificadores especiales. Cada módulo tiene un atributo __name__
. Python establece esta variable con el nombre del módulo, que el sistema de importación de Python utiliza para identificar cada módulo de forma única.
Sin embargo, si el módulo está en el entorno de código de nivel superior, lo que significa que es el módulo utilizado como punto de entrada del programa, Python establece el atributo __name__
en la cadena "__main__"
.
Veamos algunos ejemplos. Vamos a crear un script llamado exploring_name_main.py
:
# exploring_name_main.py
import random
print(__name__)
print(random.__name__)
Este script puede ejecutarse directamente utilizando el siguiente comando en el terminal:
$ python exploring_name_main.py
__main__
random
El script exploring_name_main.py
está en el entorno de código de nivel superior, ya que es el punto de entrada del programa. Por lo tanto, la variable __name__
se establece en la cadena "__main__"
.
Sin embargo, el módulo random
se importa y no está en el entorno de código de nivel superior. Su atributo __name__
se establece con el nombre del módulo.
A continuación, creamos un nuevo script llamado more_exploration.py
, que importa el primer script:
# more_exploration.py
import exploring_name_main
Ejecuta este script utilizando el siguiente comando en el terminal:
$ python more_exploration.py
exploring_name_main
random
El código de un módulo se ejecuta cuando se importa el módulo. Por lo tanto, al ejecutar more_exploration.py
, el código muestra la salida de las dos llamadas a print()
en exploring_name_main.py
. Como exploring_name_main.py
ya no es el punto de entrada del programa, su atributo __name__
se establece con el nombre del script en lugar de "__main__"
.
El if __name__ == "__main__"
Bloque condicional
La variable __name__
puede utilizarse para determinar si un módulo es el punto de entrada principal de un programa. Por tanto, un módulo puede incluir código que solo se ejecuta cuando se ejecuta directamente como script, pero no cuando se importa. Cualquier código que solo deba ejecutarse cuando el script se ejecute directamente se incluye en el bloque condicional if __name__ == "__main__"
:
# exploring_name_main.py
import random
print(__name__)
print(random.__name__)
number = random.randint(1, 10)
if __name__ == "__main__":
print("This script is in the top-level code environment")
print(f"The number is {number}")
El código de exploring_name_main.py
incluye ahora un bloque condicional if __name__ == "__main__"
. Veamos si esto marca alguna diferencia al ejecutar el script:
$ python exploring_name_main.py
__main__
random
This script is in the top-level code environment
The number is 10
Cuando el script se ejecuta directamente, la variable __name__
se establece en la cadena "__main__"
. Por tanto, la condición de la sentencia if
se evalúa como True
, y Python ejecuta el código del bloque if
.
Sin embargo, cuando se importa el módulo, __name__
se establece con el nombre del módulo, y el programa no ejecuta el bloque if
. Recuerda que el script more_exploration.py
importa exploring_name_main
:
$ python more_exploration.py
exploring_name_main
random
El programa no llama a las funciones print()
en exploring_name_main.py
. Están en el bloque condicional que no se ejecuta porque __name__
no es igual a "__main__"
.
Prácticas recomendadas y consejos para utilizar el lenguaje Python if __name__ == "__main__"
La expresión if __name__ == "__main__"
de Python se utiliza cuando el código debe ejecutarse solo cuando un archivo se ejecuta como un script en lugar de importarse como un módulo. La distinción entre los términos script y módulo solo está en cómo se utiliza el archivo. Ambos términos se refieren a archivos con la extensión .py
.
Un caso de uso común es cuando un script tiene variables, funciones y clases que pueden utilizarse en otros programas. Aquí tienes un ejemplo utilizando un script llamado shapes.py
:
# shapes.py
import math
def find_area_of_circle(radius):
return math.pi * radius ** 2
def find_area_of_rectangle(width, height):
return width * height
if __name__ == "__main__":
shape = int(input("Enter 1 for circle, 2 for rectangle: "))
if shape == 1:
radius = int(input("Enter radius: "))
print(f"The area of the circle is {find_area_of_circle(radius)}")
elif shape == 2:
width = int(input("Enter width: "))
height = int(input("Enter height: "))
print(f"The area of the rectangle is {find_area_of_rectangle(width, height)}")
Enter 1 for circle, 2 for rectangle: 2
Enter width: 10
Enter height: 20
The area of the rectangle is 200
Este código no necesita la expresión if __name__ == "__main__"
si la intención es ejecutarlo siempre como un script. Sin embargo, la inclusión de esta declaración condicional permite importar el código como módulo sin ejecutar las líneas del bloque if
. Vamos a ver otro script llamado more_shapes.py
:
# more_shapes.py
import shapes
radius = 5
print(f"The area of the circle defined in 'more_shapes.py' is: "
f"{shapes.find_area_of_circle(radius)}")
The area of the circle defined in 'more_shapes.py' is: 78.53981633974483
Este nuevo script, more_shapes.py
, tiene acceso a las funciones definidas en shapes.py
gracias a la sentencia import. Sin embargo, el código del bloque if __name__ == "__main__"
de shapes.py
no se ejecuta. Sin la declaración if
en shapes.py
, todo el código se ejecutaría al importar el módulo.
Utilizar el bloque if __name__ == "__main__"
para la entrada del usuario es un caso de uso común. La entrada del usuario se omite si el archivo se importa como módulo, pero se incluye cuando se ejecuta directamente como código de nivel superior.
Utilizar main()
una función
Es una buena práctica incluir el menor número posible de sentencias en el bloque if __name__ == "__main__"
, ya que esto hace que el código sea más legible. Una forma habitual de conseguirlo es crear una función, que se llama en el bloque condicional. Es habitual que esta función se llame main()
, pero cualquier nombre de función es válido:
# shapes.py
import math
def find_area_of_circle(radius):
return math.pi * radius ** 2
def find_area_of_rectangle(width, height):
return width * height
def main():
shape = int(input("Enter 1 for circle, 2 for rectangle: "))
if shape == 1:
radius = int(input("Enter radius: "))
print(f"The area of the circle is {find_area_of_circle(radius)}")
elif shape == 2:
width = int(input("Enter width: "))
height = int(input("Enter height: "))
print(f"The area of the rectangle is {find_area_of_rectangle(width, height)}")
if __name__ == "__main__":
main()
El código de la función main()
es el mismo que se incluía directamente en el bloque if __name__ == "__main__"
en la versión anterior del código.
En Python, la función main()
no es necesaria como punto de entrada principal al programa, a diferencia de otros lenguajes de programación. Por lo tanto, el uso de main()
y de la expresión if __name__ == "__main__"
es opcional, y solo es necesario cuando se pretende que el código se utilice como script independiente y como módulo.
Otro caso de uso común para el if __name__ == "__main__"
de Python es incluir pruebas en el script. Las pruebas se ejecutarán cuando el script se ejecute directamente, pero no cuando se importe desde otro módulo. Sin embargo, aunque este enfoque es adecuado para casos sencillos, es mejor incluir las pruebas en un módulo independiente dedicado a las pruebas.
Conclusión
El if __name__ == "__main__"
de Python es útil para incluir código que se ejecuta solo cuando se ejecuta directamente un script, pero no cuando se importa. El intérprete de Python establece la variable __name__
al nombre del módulo si es importado y a la cadena "__main__"
si el módulo es el punto de entrada principal del programa.
A diferencia de otros lenguajes de programación, la función main()
y la expresión if __name__ == "__main__"
no son un requisito para ejecutar código Python, sino una herramienta que el programador puede utilizar cuando lo necesite.
Conviértete en Ingeniero de Datos
Estudié Física y Matemáticas a nivel UG en la Universidad de Malta. Después me trasladé a Londres y me doctoré en Física en el Imperial College. Trabajé en novedosas técnicas ópticas para obtener imágenes de la retina humana. Ahora, me centro en escribir sobre Python, comunicar sobre Python y enseñar Python.