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.
N° 65