Historia de la cuestión: Los paquetes aparecieron en Python para estructurar grandes bases de código y para reutilizar código. Permiten dividir un proyecto en módulos lógicos y facilitan el mantenimiento e importación de la funcionalidad necesaria.
Problema: Una comprensión incorrecta de la estructura de los paquetes conduce a errores de importación, conflictos de nombres y errores al ejecutar scripts. Es importante conocer la diferencia entre paquetes y módulos, así como las reglas para trabajar con importaciones relativas y absolutas.
Solución:
Un paquete es cualquier directorio que contiene un archivo __init__.py (vacío o con código de inicialización). Los paquetes pueden contener otros paquetes y módulos. Ejemplo de estructura:
proyecto/
├── mip paquete/
│ ├── __init__.py
│ ├── mod1.py
│ └── subpaquete/
│ ├── __init__.py
│ └── mod2.py
└── script.py
Para importar, usamos una ruta relativa (from .subpackage import mod2) o una ruta absoluta (from mypackage.subpackage import mod2). Las absolutas son preferibles para proyectos grandes.
Características clave:
__init__.py¿Es obligatorio que haya un init.py en cada carpeta que queremos convertir en paquete?
Sí, para Python anterior a 3.3; en versiones modernas de Python (3.3+) hay paquetes de espacio de nombres «implícitos», pero para total compatibilidad se recomienda tener el archivo.
¿Qué sucede si importo un paquete en lugar de un módulo?
Sólo se ejecutará el código de __init__.py de ese paquete.
¿Cuál es la diferencia entre importar “from . import mod1” y “import mod1”?
from . import mod1 (importación relativa) funciona solo dentro del paquete, mientras que la importación absoluta busca el módulo en sys.path, lo que puede llevar a conflictos de nombres.
__init__.pyCaso negativo: Módulos con nombres idénticos en diferentes subcarpetas sin usar importaciones absolutas. Un módulo es accedido por el paquete equivocado de lo planeado. Pros:
Caso positivo:
Asignación explícita de importaciones absolutas, estructura de carpetas adecuada y existencia de __init__.py.
Pros: