Lección 27 de 45 · Módulos y orientación a objetos

Módulos e imports

Divide un programa en piezas con nombres claros y aprende a importar solo lo necesario sin perder de vista de dónde viene cada función.

Organizar códigoRastreo de origenNamespaces
Índice · Lección 27/45
Un solo archivo deja de ser cómodo mucho antes de ser «enorme»

Cuando mezclas lectura de datos, cálculos, menús y utilidades en el mismo archivo, encontrar una función empieza a costar. Un módulo te permite agrupar código relacionado y darle un nombre.

En Python, un archivo .py puede actuar como módulo. Importarlo significa hacer accesibles sus nombres desde otro lugar.

Evidencia de aprendizaje

Rastrear de qué archivo o módulo procede un nombre utilizado en otro punto del programa.

Un módulo es una caja con nombre, no magia externa

Usar un módulo de la biblioteca estándar
import math

print(math.sqrt(81))

import math hace disponible el módulo y math.sqrt deja visible de dónde procede sqrt.

Ese prefijo puede parecer más largo, pero cuando el programa crece ayuda a leer: «esta operación pertenece a math».

from ... import ... acorta el nombre a cambio de perder contexto visual

Importar un nombre concreto
from math import sqrt

print(sqrt(81))

Ambas formas son válidas. Si utilizas una función muchísimas veces y no hay riesgo de confusión, importar el nombre directamente puede ser cómodo.

La decisión no es «qué sintaxis es profesional», sino cuánta claridad quieres conservar sobre el origen del nombre.

Los alias sirven cuando el nombre original es incómodo, no para esconderlo todo

Un alias breve y reconocible
import statistics as stats

valores = [10, 20, 30]
print(stats.mean(valores))

as crea un nombre alternativo. Es útil con convenciones conocidas o nombres largos. Un alias críptico como x suele empeorar la lectura.

Cuando importas tu propio archivo, estás reutilizando una pieza del programa

Imagina un archivo precios.py con una función calcular_iva(). Otro archivo puede hacer import precios y llamar a precios.calcular_iva(...).

Esta separación permite que cada archivo tenga una responsabilidad más clara. No tienes que crear módulos desde la primera línea de un proyecto: sepáralos cuando aparezcan grupos de funciones que forman una unidad reconocible.

Evita import *: ahorrar caracteres puede costarte comprensión

from modulo import * introduce muchos nombres sin mostrar de dónde han venido. Si dos módulos definen el mismo nombre, además puedes sobrescribir uno sin darte cuenta.

Prefiere imports explícitos. El lector debería poder descubrir el origen de un nombre sin realizar una investigación.

Rastrea de dónde viene cada nombre

precios.py
def con_iva(precio):
    return precio * 1.21
app.py
from precios import con_iva

print(con_iva(100))
precios.pyexportacon_iva→ importapp.py

Actividad de ensamblaje: responde sin ejecutar:

  1. ¿En qué archivo se define con_iva?
  2. ¿Qué línea hace que el nombre esté disponible en app.py?
  3. Si cambias el nombre de la función en precios.py, ¿qué otra línea debes actualizar?
Comprobar razonamiento
  1. En precios.py.
  2. from precios import con_iva.
  3. El import de app.py y cualquier llamada que use el nombre anterior.
Por qué no hay editor de un solo archivo

Simular un import propio dentro de un único editor ocultaría precisamente la idea que quieres aprender: dos archivos con responsabilidades distintas. Aquí la práctica correcta es rastrear el origen del nombre.

Si sabes señalar el origen de un nombre, ya tienes la idea esencial

  • import math mantiene el espacio de nombres visible.
  • from math import sqrt trae un nombre concreto al archivo actual.
  • Separar módulos sirve para agrupar responsabilidades, no para multiplicar archivos sin motivo.
Siguiente dificultad real

Ya sabes importar código. Ahora toca evitar que los paquetes instalados para un proyecto contaminen todos los demás.