`if __name__ == “__main__”:` — qué hace realmente

Cada archivo Python tiene una variable especial llamada __name__. Lo interesante es que su valor cambia dependiendo de cómo llega ese archivo a ejecutarse. Cuando corres python mi_archivo.py directamente, Python le asigna a __name__ el string "__main__". Cuando otro archivo hace import mi_archivo, Python le asigna el nombre del módulo — es decir, "mi_archivo". Esa diferencia de un solo string es toda la magia detrás del patrón.

¿Por qué funciona así? Python necesita distinguir entre “este archivo es el punto de entrada del programa” y “este archivo es una biblioteca que alguien está usando”. El intérprete siempre ejecuta el código de nivel superior de cualquier archivo que cargue — no tiene forma de no ejecutarlo. La variable __name__ es el mecanismo que te da a ti el control: puedes decidir qué código corre solo cuando el archivo es el protagonista y qué código simplemente queda disponible para quien lo importe.

El momento en que esto importa de verdad es cuando tienes código de prueba, ejemplos de uso, o lógica de inicialización mezclada con funciones que otros módulos necesitan. Si no guardas ese código detrás del bloque if __name__ == "__main__":, se ejecuta automáticamente en el momento del import — y eso es un efecto secundario silencioso que puede romper tests, ralentizar importaciones, o producir salidas inesperadas en producción.

# calculadora.py

def sumar(a, b):
    return a + b

def restar(a, b):
    return a - b

def main():
    print("Calculadora interactiva")
    a = float(input("Primer número: "))
    b = float(input("Segundo número: "))
    print(f"Suma: {sumar(a, b)}")
    print(f"Resta: {restar(a, b)}")

if __name__ == "__main__":
    main()

Desglose del código

La estructura tiene tres capas claras, y cada una cumple un rol distinto.

Las funciones sumar y restar son puras — reciben datos, devuelven datos, sin efectos secundarios. Cualquier módulo puede importarlas con total confianza de que no va a pasar nada raro en el momento del import.

La función main() agrupa toda la lógica de “punto de entrada”: interacción con el usuario, flujo del programa, llamadas a las funciones de negocio. Que esté dentro de una función y no suelta a nivel de módulo es clave — significa que puedes llamarla cuando quieras, testearla, o ignorarla completamente.

El bloque if __name__ == "__main__": es el guardián. Solo deja pasar la ejecución de main() cuando el archivo es el punto de entrada. Si alguien hace from calculadora import sumar en otro archivo, ese if evalúa como False y main() nunca se llama. El módulo queda disponible sin sorpresas.

Vale la pena mencionar python -m calculadora. Cuando usas la flag -m, Python busca el módulo en el path, lo carga y también asigna "__main__" a __name__. Así que el bloque se ejecuta igual que con python calculadora.py. La diferencia está en el path de búsqueda y en cómo Python resuelve los imports relativos, pero para el propósito del bloque __main__, el comportamiento es idéntico.

Errores que debes conocer

Error: código de prueba o inicialización suelto a nivel de módulo, sin protección, que se ejecuta en cada import.

# ❌ Incorrecto
def sumar(a, b):
    return a + b

# Esto corre cada vez que alguien importa este archivo
print("Probando sumar:", sumar(2, 3))
resultado = sumar(10, 20)
# ✅ Correcto
def sumar(a, b):
    return a + b

if __name__ == "__main__":
    print("Probando sumar:", sumar(2, 3))
    resultado = sumar(10, 20)

Mover el código de prueba dentro del bloque garantiza que solo se ejecuta cuando el archivo se corre directamente.


Error: poner toda la lógica directamente en el bloque if __name__ == "__main__": en lugar de delegarla a una función.

# ❌ Incorrecto — la lógica principal es intesteable
if __name__ == "__main__":
    numeros = [1, 2, 3, 4, 5]
    total = sum(numeros)
    promedio = total / len(numeros)
    print(f"Promedio: {promedio}")
# ✅ Correcto — la lógica está en una función que se puede importar y testear
def calcular_promedio(numeros):
    return sum(numeros) / len(numeros)

if __name__ == "__main__":
    numeros = [1, 2, 3, 4, 5]
    print(f"Promedio: {calcular_promedio(numeros)}")

Con la lógica en calcular_promedio, un test puede llamar a esa función directamente sin necesidad de ejecutar el script entero.

65

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Scroll al inicio