CAP 10 · LEC 03·Módulos y paquetes

__name__ == "__main__": el punto de entrada de un script

El guardián `if __name__ == "__main__"` es omnipresente en Python. Permite que un archivo funcione tanto como script ejecutable como módulo importable — el mismo código, dos modos.

● PRINCIPIANTE5 min lectura3 ejerciciospor Fernando Herrera · actualizado mayo de 2026
¿Encontraste un error o algo que mejorar?Editá esta lección en GitHub →

Cómo funciona __name__

Cada módulo Python tiene una variable especial __name__. Su valor depende de cómo se ejecuta el archivo: si lo ejecutas directamente, vale "__main__"; si lo importas desde otro módulo, vale el nombre del módulo.

# Archivo: info.py print(f"__name__ en info.py = {__name__!r}") # Caso 1: ejecutar directamente # $ python info.py # __name__ en info.py = '__main__' # Caso 2: importar desde otro archivo # main.py: import info # __name__ en info.py = 'info' # Caso 3: importar como parte de un paquete # from mypackage import info # __name__ en info.py = 'mypackage.info' # Python siempre asigna '__main__' al script que se invoca directamente # y el nombre del módulo a cualquier import
__main__ es el punto de entrada del intérprete

Cuando ejecutas python script.py, Python asigna __name__ = '__main__' a ese archivo. Es la forma en que Python identifica el script principal, sin importar su nombre de archivo.

El patrón if __name__ == "__main__"

Envolver el código de ejecución en este if permite que el archivo sea tanto un script ejecutable como un módulo importable. Sin este guardián, el código de ejecución correría automáticamente al importar.

# Archivo: calculator.py def add(a: float, b: float) -> float: return a + b def subtract(a: float, b: float) -> float: return a - b def multiply(a: float, b: float) -> float: return a * b # ❌ Sin guardián — este código corre también al importar # print("Iniciando calculadora...") ← se ejecutaría con 'import calculator' # resultado = add(5, 3) # print(resultado) # ✅ Con guardián — solo corre cuando se ejecuta directamente if __name__ == "__main__": print("Iniciando calculadora...") print(f"5 + 3 = {add(5, 3)}") print(f"10 - 4 = {subtract(10, 4)}") print(f"6 × 7 = {multiply(6, 7)}") # Cuando otro archivo hace 'from calculator import add': # - Las funciones se cargan ✅ # - El bloque if __name__ == "__main__" NO se ejecuta ✅
SalidaIniciando calculadora... 5 + 3 = 8 10 - 4 = 6 6 × 7 = 42

Separar lógica de ejecución

La buena práctica es separar todo en funciones y llamarlas desde main(). El bloque if __name__ solo llama a main(). Esto facilita los tests, el import y la legibilidad.

# Archivo: word_counter.py import sys from collections import Counter def count_words(text: str) -> Counter: """Cuenta la frecuencia de cada palabra en el texto.""" words = text.lower().split() return Counter(words) def top_words(counter: Counter, n: int = 5) -> list[tuple[str, int]]: """Retorna las n palabras más frecuentes.""" return counter.most_common(n) def format_results(results: list[tuple[str, int]]) -> str: lines = [f" {word:<20} {count}" for word, count in results] return " ".join(lines) def main() -> None: texto = "python es genial python es poderoso python es limpio" contador = count_words(texto) top = top_words(contador, n=3) print("Palabras más frecuentes:") print(format_results(top)) # Solo ejecuta main() cuando se llama directamente if __name__ == "__main__": main()
SalidaPalabras más frecuentes: python 3 es 3 genial 1
Sin separarCon main() separada
Código suelto en el nivel del móduloTodo dentro de main()
Imposible testear sin ejecutar el scriptfrom word_counter import count_words — testeable
Corre al importar si falta el guardiánSeguro para importar en cualquier contexto

Practica