21 · Módulos: import, from, as
Cada archivo .py es un módulo. Domina import, from … import, los alias y el guard __name__ que mantiene los scripts seguros para reutilizar.
Un **módulo** es cualquier archivo `.py`. `import math` te da el objeto del módulo; `from math import sqrt` trae un nombre específico directamente a tu espacio de nombres; `import numpy as np` vincula un alias corto. Python busca en `sys.path` — una lista ordenada de directorios — para encontrar cada módulo.
Sin esto:
Sin módulos, toda función reutilizable debe copiarse y pegarse en cada script que la necesite — un error tipográfico en una copia provoca una divergencia silenciosa. Los módulos permiten escribir código una vez e importarlo en todos lados.
Cada archivo .py es un módulo. Cuando Python ejecuta import math, busca en sys.path (una lista de directorios — el directorio actual, las rutas de paquetes instalados y las rutas de stdlib), encuentra math, lo ejecuta una vez, almacena el resultado en caché en sys.modules y vincula el nombre math en tu espacio de nombres. from math import sqrt, pi importa nombres específicos directamente — omites el prefijo math.. import numpy as np vincula el módulo al nombre más corto np. El guard if __name__ == "__main__": al final de un archivo permite escribir código que solo se ejecuta cuando el archivo se corre directamente — nunca cuando es importado como módulo por otro script.
Python (in browser)
`import math` mantiene todos los nombres dentro del espacio de nombres `math`. Dos módulos importados pueden tener ambos una función `log` y nunca colisionarán porque se acceden como `math.log` y `cmath.log`.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
`from math import sqrt, pi` coloca esos dos nombres directamente en tu espacio de nombres local. Nótese que la última línea fallaría — una vez que usas `from math import ...` ya no tienes disponible el prefijo `math` a menos que también hayas escrito `import math`.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
`import math as m` vincula el módulo a `m`. Los alias `np`, `pd` y `plt` son convenciones de la comunidad tan arraigadas que los linters te advertirán si te apartas de ellas.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Sin el guard `if __name__ == "__main__":`, importar `compute_loss` de `train.py` también dispararía un entrenamiento — una fuente habitual de sorpresas. El guard hace que el archivo sea seguro de importar y aún ejecutable como script.
¿Qué logra escribir `import numpy as np`?
- `import math` — objeto de módulo en el espacio de nombres; acceso via `math.sqrt`. `from math import sqrt` — nombre directamente en scope. `import numpy as np` — módulo completo, alias corto.
- Python encuentra módulos buscando en `sys.path` en orden: directorio actual, luego paquetes instalados, luego stdlib. Una vez encontrado, el módulo se almacena en caché en `sys.modules` — las importaciones posteriores son gratuitas.
- Agrega `if __name__ == "__main__":` al final de cualquier script que también quieras que sea importable. Evita que el código de nivel superior del script se ejecute al importarlo.
Todo script de ML comienza con `import numpy as np; import pandas as pd; import torch`. El alias `as np` es tan universal que romperlo confundiría a todo lector. El guard `if __name__ == "__main__":` permite que `train.py` sea tanto un script de entrenamiento standalone como un módulo importable, de modo que un orquestador de búsqueda de hiperparámetros puede llamar `from train import compute_loss` sin disparar un entrenamiento completo.
Si lo quitas: Sin importaciones de módulos, cada proyecto de ML necesitaría incluir una copia de numpy, pandas y scikit-learn directamente en cada script — o pegar el código fuente. Los módulos hacen que todo el ecosistema de Python esté disponible para cualquier archivo con una sola línea.