Curso de Python 7: Módulos y paquetes

Módulos

Las funciones son recursos muy útiles para reutilizar pequeños fragmentos de código dentro del ámbito del script que estamos usando. Sin embargo, los proyectos suelen ser grandes, y pueden requerir de muchos scripts, en cada uno de los cuales se contempla una determinada funcionalidad del programa en general. Algunas veces, podrá organizarse un gran proyecto, compuesto a su vez de varios proyectos más pequeños. También, a veces, podremos tener varios proyectos dentro de una organización. En cualquiera de estos casos será necesario reutilizar código de forma compartida.

Los módulos son archivos que generalmente contienen funciones, y pueden ser reutilizados a modo de librería compartida desde cualquier script en cualquier proyecto. Vienen a ser cajas de herramientas disponibles para todos, normalmente organizadas según su función o utilidad. Las funciones de un módulo pueden ser importadas dentro de otros módulos principales, o dentro de un script. Un módulo también puede contener código ejecutable.

Para poner en práctica estos conceptos, vamos a crear un archivo llamado matematicas.py, donde guardaremos algunas funciones matemáticas:

def suma(a,b):
   return a+b

def resta(a,b):
   return a-b

def producto(a,b):
   return a*b

def division(a,b):
   return a/b

def resto(a,b):
   return a%b 

def potencia(a,b):
   return a**b

Una vez guardado, para utilizar las funciones del módulo importaríamos el módulo mediante la sentencia import. El siguiente ejemplo, muestra cómo hacerlo desde la consola Python, aunque el concepto es también válido para un script. Las importaciones de módulos se tomarán por defecto en el mismo directorio que donde abrimos el intérprete Python o la consola. Si los módulos están en otro directorio, habrá que especificar la ruta correcta en el variable PYTHONPATH:

>>> import matematicas
>>> print matematicas.suma(3,2)
5
>>> matematicas.resta(3,2)
1
>>> matematicas.producto(3,2)
6
>>> matematicas.division(6,2)
3
>>> matematicas.resto(3,2)
1
>>> matematicas.potencia(3,2)
9

Para invocar a una función del módulo, se llama a ésta anteponiendo el nombre del módulo, seguido de un punto, y del nombre de la función.

Otra forma de importar funciones de un módulo, es de forma selectiva, indicando qué funciones vamos a utilizar:

>>> from matematicas import suma, producto
>>> print suma(3,2)
5
>>> resta(3,2) # funcion no importada
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'resta' is not defined

Si a la cláusula import indicamos un asterisco, se importarán todas las funciones del módulo:

>>> from matematicas import *
>>> resta(3,2)
1
>>> import matematicas
>>> matematicas.resta(3,2)
1

La diferencia entre usar la sentencia from y la sentencia import, es que con from no es necesario indicar el nombre del módulo junto al nombre de la función, sino directamente el nombre de la función. En el caso de la sentencia import, si se utiliza a menudo una función y se desea ahorrar código, se puede asignar a un nombre local, y utilizar éste para las llamadas:

>>> import matematicas
>>> res = matematicas.resta
>>> res(3,2)
1 

Paquetes
La mejor forma de organizar nuestros módulos es mediante paquetes. Un paquete es un sistema de clasificación de módulos de funciones mediante directorios, siendo estos jerárquicos mediante niveles de especialización. Por ejemplo, si se desarrollaran módulos para tratar archivos multimedia, podríamos tener un primer nivel llamado multimedia, de éste colgarían varias ramas, como video, imagen y sonido. Dentro de video, por ejemplo, podrían colgar las ramas hd (alta definición) y bd (baja definición), y dentro de éstas podrían colgar las ramas formatos, drivers y motores. En cada una de las ramas, puede haber módulos o más ramas, según nuestro criterio de clasificación. Cuando se quiere utilizar un determinado módulo, hay que indicar la ruta completa del paquete hasta el módulo, que coincide con el árbol de directorios. Por ejemplo:

>>> import multimedia.video.hd.drivers.avidriver
>>> from multimedia.video.hd.drivers import avidriver


Entregas:

Enlaces de interés: