Guía sobre importaciones en Python
En este post hablaremos sobre cómo usar import en Python, y realizaremos una guía sobre importaciones de módulos y funciones en nuestro código.
Una importación en Python es un mecanismo que permite acceder a código definido en otro archivo, módulo o biblioteca, sin necesidad de copiarlo. Esto permite reutilizar funciones, clases o variables, organizando mejor los programas.
En Python, cada archivo .py
es un módulo, y un conjunto de módulos organizados en carpetas (que contienen un __init__.py
) es un paquete. Para importar un módulo utilizamos import
y el nombre del módulo.
import math
print(math.sqrt(25))
En este ejemplo hemos importado el módulo de la biblioteca estándar de Python math
. Una vez importado podemos utilizar las funciones del módulo en nuestro archivo.
También es posible importar una función específica del módulo. Al hacer esto no será necesario referenciar el módulo al llamar a la función.
from math import sqrt
print(sqrt(25))
En el caso en que el nombre del módulo sea muy largo o se repita en muchas ocasiones en el código podemos crear un alias utilizando as
. Esto permitirá que el módulo sea referenciado con un nombre distinto al original.
import math as m
print(m.sqrt(25))
Los módulos importados pueden ser parte de la biblioteca estándar de Python (math
, os
, sys
, datetime
, etc), pueden ser módulos de terceros que hayamos instalado utilizando pip
o conda
(numpy
, pandas
, etc) o archivos .py propios creados dentro de nuestro proyecto.
¿Cómo funciona el import en Python?
Cuando realizamos una importación en Python se ejecutan diferentes pasos:
- Se busca el módulo importado en la caché
- Si el módulo no se encuentra en la caché se los busca en el sistema de archivos
- Si encuentra el módulo lo carga y ejecuta el código que contiene
- Guarda el módulo en memoria para futuras importaciones
- Si no lo encuentra lanza un error
ModuleNotFoundError
Cuando Pyhton está buscando un módulo en el sistema para importarlo sigue un orden específico de carpetas que se encuentra definido en la lista sys.path
. Es posible ver el contenido de esta lista con el siguiente código.
import sys
print(sys.path)
Esto da como salida una lista similar a la siguiente
['/home/usuario/proyecto',
'/usr/lib/python313.zip', '/usr/lib/python3.13',
'/usr/lib/python3.13/lib-dynload', '/usr/local/lib/python3.13/dist-packages',
'/usr/lib/python3/dist-packages']
Como puede observarse busca el módulo primero dentro del proyecto que contiene el archivo que ha hecho la importación, luego en directorios de python y finalmente en paquetes de terceros instalados.
Importación absoluta y relativa
Supongamos que tenemos un proyecto con dos paquetes (paqueteA
y paqueteB
). Cada uno de estos paquetes contiene archivos que tienen definidas funciones.
proyecto/
├── main.py
├── paqueteA/
│ └── __init__.py
│ └── funciones.py
└── paqueteB/
└── __init__.py
└── herramientas.py
└── otros.py
Se una función del archivo herramientas.py
del paqueteB
, requiere importar una función del archivo funciones.py
del paqueteA
es necesario realizar una importación absoluta.
La importación absoluta utiliza la ruta completa desde el directorio raíz del proyecto o desde el paquete instalado. Esto permite ver de manera mas clara el origen de cada módulo instalado lo que facilita la escalabilidad y lo hace ideal para proyectos grandes.
En nuestro ejemplo el archivo herramientas.py
del paqueteB
tendría la siguiente importación:
from paqueteA.funciones import funcionA
Y el archivo main.py
podría importar la función herramientaB()
del paqueteB
para ejecutarla
from paqueteB.herramientas import herramientaB
if __name__ == "__main__":
herramientaB()
Es importante aclarar que para que este tipo de importación funcionen correctamente se debe estar ejecutando desde la raíz del proyecto. En nuestro ejemplo el archivo main.py
.
La importación relativa, por otro lado, se utiliza cuando las importaciones se realizan dentro de un mismo paquete. En ella se indica la posición relativa de módulos dentro del paquete. Donde un ‘punto’ (.
) significa el mismo paquete y ‘punto punto’ (..
) significa el paquete padre. Esto es útil para paquetes reutilizables y evita que surjan conflictos si el paquete raíz es renombrado.
Siguiendo el ejemplo anterior, el archivo herramientas.py
del paqueteB
podría importar la función otraFuncion()
del archivo otros.py
, también del paqueteB
, utilizando la importación relativa.
from paqueteA.funciones import funcionA
from .otros import otraFuncion
El archivo __init__
El archivo __init__
es utilizado en Python para definir un conjunto de módulos como un paquete. Pero también puede utilizarse para definir cómo y de que manera son importadas las funciones de un módulo desde afuera del mismo. En este artículo explico los diferentes usos del archivo __init__
para realizar importaciones.
Importaciones con alias
En Python es posible usar alias para renombrar módulos, funciones o clases en el momento de importarlos. Esto se hace con la palabra clave as
. Los alias permiten que el código sea más claro, conciso y legible.
import nombre_modulo as alias #Importar módulo
from nombre_modulo import función as alias #Importar función
Los alias pueden ser útiles cuando se realiza una importación absoluta para evitar tener que escribir todo el path al hacer la referencia.
import modulo.submodulo.sub_submodulo.herramientas as herramientas
herramientas.suma(10, 5)
También puede utilizarse para evitar conflictos de nombres, por ejemplo si se van a importar dos funciones de módulos diferentes que tienen el mismo nombre.
import moduloA.herramientas as herrA
import moduloB.herramientas as herrB
Finalmente existen alias convencionales utilizados por la comunidad para bibliotecas populares, estos alias no solo acortan los nombres de las librerías sino que facilitan la lectura de código cuando es compartido.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
En este artículo hemos visto como Python realiza importaciones, los usos de las importaciones relativas y absolutas y el uso de alias para hacer el código más legible y claro.