- 1. Introducción
- 2. Concepto de Módulo
- 3. Creación y Uso de Módulos
- 4. Importación de Módulos
- 5. Namespaces en Python
- 6. Paquetes en Python
- 6.1. Creación de un Paquete
- 6.2. Uso de Paquetes y Submódulos
- 6.3. Importaciones Relativas y Absolutas
- 6.3.1. Importación Absoluta
- 6.3.2. Importación Relativa
- 7. Gestión de Namespaces: init.py
- 8. Ejercicios de Práctica
- 9. Conclusión
- 10. Referencias
1. Introducción
Python organiza el código en módulos y paquetes para hacerlo más estructurado, modular y reutilizable. Este tutorial explora cómo trabajar con módulos, paquetes y namespaces en Python, comenzando desde conceptos básicos y avanzando hacia ejemplos complejos. La estructura está pensada para que puedas ir profundizando a medida que practicas.
2. Concepto de Módulo
Un módulo en Python es un archivo que contiene definiciones y declaraciones de Python, como funciones, clases y variables. La idea principal es dividir el código en archivos separados para una mejor organización y reutilización.
Por ejemplo, si tienes un archivo llamado matematicas.py, este puede considerarse un módulo y podría contener definiciones como:
# matematicas.py
def sumar(a, b):
return a + b
def restar(a, b):
return a - b
3. Creación y Uso de Módulos
3.1. Paso 1: Creación de un Módulo
Supongamos que creamos un archivo llamado saludos.py que contiene las siguientes definiciones:
# saludos.py
def saludo_ingles():
return "Hello!"
def saludo_euskera():
return "Kaixo!"
def saludo_frances():
return "Bonjour!"
3.2. Paso 2: Uso de Módulos
Podemos importar el módulo saludos en otro archivo o en el intérprete de Python:
# main.py
import saludos
print(saludos.saludo_ingles()) # Output: Hello!
print(saludos.saludo_euskera()) # Output: Kaixo!
print(saludos.saludo_frances()) # Output: Bonjour!
3.3. Paso 3: Alias para Módulos
Puedes usar alias para facilitar la llamada a los módulos, especialmente si el nombre es muy largo:
import saludos as s
print(s.saludo_ingles()) # Output: Hello!
4. Importación de Módulos
4.1. Importación Completa
Al importar un módulo completo, se pueden acceder a todas sus definiciones:
import matematicas
resultado = matematicas.sumar(3, 5)
print(resultado) # Output: 8
4.2. Importación Específica
Puedes importar definiciones específicas de un módulo usando from ... import ...:
from matematicas import sumar, restar
print(sumar(10, 5)) # Output: 15
print(restar(10, 5)) # Output: 5
4.3. Importación con * (Importar Todo)
Al hacer from ... import *, importas todas las definiciones del módulo. Sin embargo, esta práctica no se recomienda porque puede generar conflictos de nombres:
from saludos import *
print(saludo_ingles()) # Output: Hello!
5. Namespaces en Python
Un namespace es una colección de nombres (identificadores) en un entorno particular. Python organiza estos espacios para evitar colisiones entre nombres. Existen tres tipos de namespaces principales:
- Local: Se refiere a nombres definidos dentro de una función.
- Global: Se refiere a nombres definidos en el módulo en el que te encuentras.
Built-in: Se refiere a nombres integrados en Python como
len()oint.# Ejemplo de namespaces def funcion(): local_variable = "Soy una variable local" # Namespace local print(local_variable) global_variable = "Soy una variable global" # Namespace global print(global_variable)
5.1. Conflictos de Nombres
Si se definen variables con el mismo nombre en distintos namespaces, Python utiliza la regla de resolución de nombre LEGB (Local, Enclosing, Global, Built-in).
def funcion():
var = "local"
print("Valor de la variable dentro de la función:", var)
var = "global"
funcion()
print("Valor de la variable fuera de la función:", var)
Salida:
Valor de la variable dentro de la función: local
Valor de la variable fuera de la función: global
6. Paquetes en Python
Un paquete es una colección de módulos organizados en un directorio que contiene un archivo especial llamado init.py. Este archivo indica a Python que el directorio debe tratarse como un paquete y se utiliza para inicializar el paquete.
6.1. Creación de un Paquete
Supongamos que tienes la siguiente estructura de archivos:
mi_proyecto/
├── geometria/
│ ├── __init__.py
│ ├── circulo.py
│ └── rectangulo.py
└── main.py
geometriaes un paquete, ycirculo.pyyrectangulo.pyson módulos dentro de este paquete.__init__.pyes un archivo especial que puede estar vacío o contener código de inicialización para el paquete.
6.2. Uso de Paquetes y Submódulos
Dentro de main.py, puedes importar módulos del paquete geometria:
# main.py
from geometria import circulo, rectangulo
print(circulo.area(5)) # Supongamos que `area` es una función definida en `circulo.py`
print(rectangulo.perimetro(4, 7)) # Supongamos que `perimetro` es una función definida en `rectangulo.py`
6.3. Importaciones Relativas y Absolutas
6.3.1. Importación Absoluta
Se utilizan rutas completas del paquete para importar módulos:
from geometria.circulo import area
6.3.2. Importación Relativa
Se usan puntos (.) para indicar niveles de la jerarquía. Por ejemplo, desde rectangulo.py, puedes importar algo de circulo.py usando:
from .circulo import area # Importa `area` desde `circulo.py`
Las importaciones relativas permiten mover paquetes sin cambiar las rutas de importación.
7. Gestión de Namespaces: init.py
El archivo __init__.py se utiliza para gestionar qué módulos y definiciones deben estar disponibles al importar el paquete:
# geometria/__init__.py
from .circulo import area
from .rectangulo import perimetro
Con este __init__.py, puedes importar el paquete geometria de la siguiente manera:
import geometria
print(geometria.area(5))
print(geometria.perimetro(4, 7))
8. Ejercicios de Práctica
- Crear un módulo para operaciones con matrices: Define un módulo que contenga funciones para sumar, restar y multiplicar matrices.
- Construir un paquete
animales: Crea un paquete con submódulos comomamiferos.py,aves.pyypeces.py, cada uno con funciones específicas que describan comportamientos. - Implementar una calculadora científica: Crea un paquete llamado
calculadoracon submódulos para operaciones básicas, trigonométricas y estadísticas.
9. Conclusión
Trabajar con módulos y paquetes te permite organizar y reutilizar el código de manera eficiente. El uso correcto de namespaces evita colisiones de nombres, y las importaciones relativas y absolutas te permiten organizar mejor tus proyectos.