__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.
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 importCuando 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 ✅Iniciando calculadora...
5 + 3 = 8
10 - 4 = 6
6 × 7 = 42Separar 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()Palabras más frecuentes:
python 3
es 3
genial 1| Sin separar | Con main() separada |
|---|---|
| Código suelto en el nivel del módulo | Todo dentro de main() |
| Imposible testear sin ejecutar el script | from word_counter import count_words — testeable |
| Corre al importar si falta el guardián | Seguro para importar en cualquier contexto |