Saltar al contenido principal
InicioTutorialesPython

if __name__ == "__main__" Python: Explicación completa

El bloque if __name__ == "__main__" de Python te permite definir código que sólo se ejecutará cuando el archivo se ejecute directamente como script, pero no cuando se importe como módulo en otro script.
Actualizado ago 2024  · 8 min leer

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 idiomas también pueden malinterpretar y utilizar en exceso este modismo.

Este tutorial se sumerge en el significado del lenguaje if__name__ == "__main__" de Python y explora cómo y cuándo utilizarlo.

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 método 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 sólo se ejecuta cuando se ejecuta directamente como script, pero no cuando se importa. Cualquier código que sólo 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__"

El lenguaje if __name__ == "__main__" de Python se utiliza cuando el código debe ejecutarse sólo cuando un archivo se ejecuta como un script en lugar de importarse como un módulo. La distinción entre los términosscript y módulo sólo 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 el modismo 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. Considera 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.

Utilizando un main() 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 del lenguaje if __name__ == "__main__" es opcional, y sólo 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 sólo 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 el lenguaje if __name__ == "__main__" no son un requisito para ejecutar código Python, sino una herramienta que el programador puede utilizar cuando lo necesite.

Temas

Los mejores cursos de Ingeniería de Datos

Track

Ingeniero de datos

57 horas hr
Adquiere habilidades demandadas para ingerir, limpiar y gestionar datos de forma eficaz, así como para programar y supervisar canalizaciones, lo que te diferenciará en el campo de la ingeniería de datos.
See DetailsRight Arrow
Start Course
Certificación disponible

Course

ETL y ELT en Python

4 hr
10.4K
Aprende a construir canalizaciones de datos eficaces, eficaces y fiables utilizando los principios de Extracción, Transformación y Carga.
Ver másRight Arrow
Relacionado

tutorial

if...elif...else en el tutorial de Python

Aprende a crear sentencias if...elif...else en Python.
DataCamp Team's photo

DataCamp Team

4 min

tutorial

Cómo comentar un bloque de código en Python

Utilizar comentarios es fundamental para trabajar eficazmente con Python. En este breve tutorial, aprenderás a comentar un bloque de código en Python.
Adel Nehme's photo

Adel Nehme

3 min

tutorial

Tutorial sobre cómo trabajar con módulos en Python

Los módulos te permiten dividir partes de tu programa en archivos diferentes para facilitar el mantenimiento y mejorar el rendimiento.

Nishant Kumar

8 min

tutorial

Tutorial sobre cómo ejecutar scripts en Python

Aprenda cómo puede ejecutar un script Python desde la línea de comandos, y también cómo puede proporcionar argumentos de línea de comandos a su script.
Aditya Sharma's photo

Aditya Sharma

10 min

tutorial

Dos métodos sencillos para convertir un archivo Python en un archivo Exe

Aprende qué es un archivo ejecutable y por qué puede ser útil, mientras ves cómo convertir un script de Python en un ejecutable utilizando auto-py-to-exe.
Kurtis Pykes 's photo

Kurtis Pykes

6 min

tutorial

Manejo de excepciones y errores en Python

Los errores y las excepciones pueden provocar fallos en el programa o comportamientos inesperados, y Python viene con un sólido conjunto de herramientas para mejorar la estabilidad del código.
Abid Ali Awan's photo

Abid Ali Awan

21 min

See MoreSee More