ProgramaciónDesarrollador Backend

¿Qué sucede cuando se importa un módulo en Python? ¿Cómo busca y carga Python los módulos? ¿Qué errores típicos se pueden cometer debido a una mala organización de las importaciones?

Supere entrevistas con el asistente de IA Hintsage

Respuesta.

Cuando se importa un módulo en Python, el intérprete lo busca en los directorios enumerados en sys.path. Primero busca entre los módulos estándar, luego entre archivos .py, .pyc y directorios con un archivo __init__.py (paquetes).

  1. Si el módulo ya ha sido importado, la importación repetida simplemente lo toma de sys.modules.
  2. Si el módulo no se encuentra en las rutas estándar, se lanzará una excepción ModuleNotFoundError.
  3. Al importar, el módulo se traduce a bytecode (.pyc) y se almacena en caché (si hay permisos de escritura).

Ejemplo:

# mypkg/__init__.py (puede estar vacío) # mypkg/mod.py # main.py import mypkg.mod
  • El nombre del archivo, la estructura de directorios y la presencia/ausencia de __init__.py (para Python <3.3 es obligatorio) — todo es importante.

Cómo busca:

  • Primero importación absoluta.
  • Luego, busca en los directorios de sys.path (siempre empieza por el directorio del script actual).
  • En los paquetes, el contexto es importante (from . import ..., importación absoluta/relativa).

Pregunta capciosa.

¿Qué sucederá si en el directorio de tu script hay un archivo llamado random.py y tratas de importar el módulo estándar random?

Respuesta:

Se importará MI archivo local random.py, no la biblioteca estándar. Una causa común de errores difíciles de detectar es la colisión de nombres de módulos con bibliotecas (shadowing). Se debe ser cuidadoso al nombrar archivos.

Ejemplos de errores reales debido al desconocimiento de los matices del tema.


Historia

En un gran proyecto, el módulo email.py accidentalmente oscureció el módulo estándar email de la biblioteca, y los desarrolladores no podían entender por qué no funcionaban las funciones de análisis de correo de bibliotecas externas.


Historia

En un proyecto de ML, la función os.path no funcionaba: junto al script principal había un archivo os.py, que interceptaba todas las llamadas al módulo estándar. Se gastó un mes en depuración hasta que se encontró el conflicto de nombres.


Historia

En un API REST de microservicios surgieron importaciones cíclicas al intentar realizar importaciones relativas de modelos entre varios subpaquetes. Se resolvió el problema solo después de refactorizar la estructura del proyecto y establecer un orden explícito de carga de módulos.