CAP 10 · LEC 01·Módulos y paquetes

import y from: organizar el código en módulos

Un módulo es simplemente un archivo .py. import lo carga. La diferencia entre `import math` y `from math import sqrt` va más allá de la sintaxis — afecta el namespace y la legibilidad.

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

import básico

import modulo carga el módulo y lo añade al namespace actual como un objeto. Para acceder a sus funciones y clases, usas modulo.nombre. Todo queda bajo el espacio de nombres del módulo — no hay colisiones.

import math import random import datetime # Acceso con el prefijo del módulo — claro y sin ambigüedad print(math.pi) # 3.141592653589793 print(math.sqrt(16)) # 4.0 print(math.floor(3.7)) # 3 # random numero = random.randint(1, 10) print(f"Número aleatorio: {numero}") # datetime — el módulo contiene clases y funciones hoy = datetime.date.today() print(hoy) # 2026-05-03 # Inspeccionar qué hay en un módulo print(dir(math)) # [..., 'ceil', 'cos', 'floor', 'pi', 'sqrt', ...]
Salida3.141592653589793 4.0 3 Número aleatorio: 7 2026-05-03
Python importa un módulo solo una vez

Aunque escribas import math en diez archivos distintos, Python lo carga en memoria una sola vez y lo guarda en sys.modules. Los imports posteriores solo recuperan la referencia ya cargada — no releen el archivo.

from ... import ...

from modulo import nombre importa un nombre específico directamente al namespace actual. No necesitas el prefijo al usarlo, pero puede ocultar de dónde viene si el nombre es genérico.

from math import sqrt, pi, ceil # Sin prefijo — más conciso cuando usas pocas cosas de un módulo print(sqrt(25)) # 5.0 print(pi) # 3.141592653589793 print(ceil(3.2)) # 4 # Importar múltiples nombres from datetime import date, timedelta, datetime hoy = date.today() manana = hoy + timedelta(days=1) print(f"Hoy: {hoy}, Mañana: {manana}") # from ... import * — importa todo (evitar en producción) # from math import * # contamina el namespace — difícil saber de dónde viene cada nombre # Importar una clase from collections import defaultdict, Counter palabras = ["python", "es", "python", "genial", "python"] frecuencia = Counter(palabras) print(frecuencia) # Counter({'python': 3, 'es': 1, 'genial': 1})
Salida5.0 3.141592653589793 4 Hoy: 2026-05-03, Mañana: 2026-05-04 Counter({'python': 3, 'es': 1, 'genial': 1})
import modulofrom modulo import nombre
import math math.sqrt(4)from math import sqrt sqrt(4)
Claro de dónde viene. Recomendado cuando usas muchas cosas del móduloMás conciso. Recomendado cuando usas 1-3 cosas específicas
Más verbose con módulos de nombre largoPuede ocultar el origen si el nombre es genérico (ej: open, type)

Alias con as

import modulo as alias o from modulo import nombre as alias crea un nombre alternativo. Útil para módulos con nombres largos o para evitar colisiones de nombres.

# Alias de módulo — convención estándar en la comunidad import numpy as np # convención universal import pandas as pd # convención universal import matplotlib.pyplot as plt # convención universal # Para módulos propios con nombres largos import datetime as dt ahora = dt.datetime.now() print(ahora.strftime("%Y-%m-%d %H:%M")) # Alias de nombre — cuando el nombre colisiona con algo local from os.path import join as path_join from urllib.parse import urljoin as url_join ruta = path_join("/home", "usuario", "proyecto") url = url_join("https://ejemplo.com/api/", "usuarios") print(ruta) # /home/usuario/proyecto print(url) # https://ejemplo.com/api/usuarios
Salida2026-05-03 14:30 /home/usuario/proyecto https://ejemplo.com/api/usuarios

Imports relativos vs absolutos

En un paquete, puedes importar con rutas absolutas desde la raíz del proyecto o con rutas relativas (. para el mismo paquete, .. para el padre). Los absolutos son más claros; los relativos son útiles para evitar hard-codear el nombre del paquete.

# Estructura hipotética del proyecto: # myapp/ # __init__.py # utils.py # models/ # __init__.py # user.py # product.py # Desde myapp/models/user.py: # Import absoluto — claro, funciona desde cualquier lugar from myapp.utils import format_date, validate_email # Import relativo — . significa "mismo directorio" from . import product # importa myapp/models/product.py from .product import Product # importa la clase Product # Import relativo al padre — .. sube un nivel from .. import utils # importa myapp/utils.py from ..utils import format_date # Cuándo usar cada uno: # - Absolutos: preferidos en proyectos; más explícitos # - Relativos: útiles dentro de un paquete para independizarlo de su nombre
Guía de estilo PEP 8 para imports

PEP 8 recomienda ordenar los imports en tres bloques separados por una línea en blanco: 1) módulos de la biblioteca estándar, 2) paquetes de terceros (pip), 3) módulos propios del proyecto. Herramientas como isort automatizan este orden.

Practica