Introducción a la programación en Python

clase 09b
Módulos y paquetes

Módulos

En Python, un módulo es simplemente un archivo .py con código que puede incorporarse a un programa mediante la importación del módulo. De esta manera, estarán disponibles en el programa todos los elementos incluidos en el módulo, que pueden ser tanto funciones como variables, tipos de datos y de estructuras de datos, clases, métodos, etcétera.

La distribución de Python incluye un conjunto de módulos que constituyen la biblioteca estándar del lenguaje, y que pueden importarse directamente mediante la directiva import modulo. En clases anteriores se vieron varios de estos módulos, como math, random, os, sys, argparse, etcétera. La lista completa de módulos disponibles se puede consultar en la documentación oficial de la Biblioteca Estándar de Python.

módulos definidos por el usuario

Desarrollar un módulo definido por el usuario consiste simplemente en escribir funciones (eventualmente otros elementos) en un archivo .py que esté accesible desde el programa que se está desarrollando (lo más sencillo es ponerlo en el mismo directorio). El nombre del módulo va a ser el mismo nombre del archivo, sin la extensión .py.

Por ejemplo, podemos escribir la función isorritmico() desarrollada en la tarea 5, en un archivo llamado musmod.py:

In [ ]:
# %load musmod.py
'''Módulo personal con funciones para procesar datos musicales'''


def isorritmico(talea, color):
    '''Crea una melodía isorrítmica a partir de una talea y un color

    Recibe una lista con alturas en número de nota MIDI [color]
    y otra con duraciones en fracciones de beat [talea]
    
    Devuelve una lista de notas como tuplas (altura, duración)'''

    # extiende las secuencias para que tengan la misma cantidad de elementos
    talea *= len(color)
    color *= len(talea)
    # crea la lista de notas como tuples (altura, duración)
    notas = [(x, y) for x, y in zip(color, talea)]
    return notas

Si el archivo musmod.py está en el mismo directorio donde estamos desarrollando el programa, podemos importarlo como cualquier módulo:

import musmod

Si queremos darle un nombre más abrevidado (por ejemplo, mm), podemos usar la directiva:

import musmod as mm

También se puede importar una función específica:

from musmod import isorritmico

Una vez que el módulo fue importado, todas las funciones y demás elementos contenidos en él, estarán disponibles en nuestro programa. También podemos obtener información del módulo mediante la función help(), como ser el nombre del módulo (y su descripción, si tiene un docstring), las funciones y otros elementos que incluye, y la ubicación del archivo.

In [1]:
import musmod as mm
help(mm)
Help on module musmod:

NAME
    musmod - Módulo personal con funciones para procesar datos musicales

FUNCTIONS
    isorritmico(talea, color)
        Crea una melodía isorrítmica a partir de una talea y un color
        
        Recibe una lista con alturas en número de nota MIDI [color]
        y otra con duraciones en fracciones de beat [talea]
        
        Devuelve una lista de notas como tuplas (altura, duración)

FILE
    /home/lj/data/material_cursos/python/2020/clase_09/musmod.py


Vemos que el módulo contiene una única función, y se muestra la documentación incluida en su docstring.

La función isorritmico() está ahora disponible para usar en nuestro código:

In [ ]:
talea = [0.75, 0.5, 0.25, 0.5]
color = [72, 62, 59, 56, 67]

melodia = mm.isorritmico(talea, color)

for n in melodia:
    print(n[0], n[1], sep='\t')

El módulo se puede extender con más funciones, hasta convertirse en toda una biblioteca de funciones relacionadas, que pueden reutilizarse en distintos programas.

Paquetes

En Python, un paquete es un conjunto de uno o más módulos con una organización determinada, que pueden instalarase de modo de quedar accesibles para cualquier programa que se desarrolle.

Como Python es un lenguaje muy utilizado y con una amplia base de usuarios, existe una enorme cantidad de paquetes ya desarrollados para aplicaciones específicas. Podemos mencionar por ejemplo Numpy para análisis numérico, Matplotlib para visualización y representación gráfica de datos, SciPy para computación científica, pandas para análisis y procesamiento de datos, librosa y Essentia para análisis de señales audio y música, music21 para musicología computacional y procesamiento de música en notación simbólica, carat para análisis de patrones rítmicos, etcétera.

Se pueden buscar paquetes en el Python Package Index (PyPI), un índice centralizado de paquetes disponibles para Python, con información y documentación de cada uno de ellos.

pip

Para poder utilizar las funcionalidades incluidas en un paquete, primero debe ser instalado, lo que puede hacerse de diversas maneras.

El comando pip viene incluido en la distribución de Python, y ofrece una forma muy fácil y conveniente de instalar y administrar cualquier paquete que esté incluido en el Python Package Index.

Se puede verificar que el comando está bien instalado, ejecutándolo desde la línea de comando con la opción --versión o -V:

pip --version
pip -V

La forma genérica de ejecutar el programa es:

pip <comando> [opciones]

Por ejemplo, el comando help muestra una lista de todos los comandos y opciones disponibles:

pip help

Lo mismo puede obtenerse con la opción --help o -h:

pip --help
pip -h

Veamos a continuación los comandos más importantes para instalar y administrar paquetes.

instalación

El comando de pip para instalar paquetes es install, seguido del nombre de uno o más paquetes a ser instalados:

pip install paquete

pip install paquete1 paquete2 ...

Si se pide instalar un paquete que requiere otros, pip se encarga automáticamente de instalar todas las dependencias.

desinstalación

Se pueden desinstalar paqueter con el comando uninstall, seguido del nombre de uno o más paquetes a ser desinstalados:

pip uninstall paquete

pip uninstall paquete1 paquete2 ...

Este comando desinstala solamente los paquetes que se pasan como argumento, pero no los paquetes que se hayan instalado como dependencias.

información

El comando list (sin argumentos) imprime una lista de todos los paquetes instalados, con sus versiones:

pip list

El comando show muestra información más completa de el o los paquetes que se pasen como argumento:

pip show paquete1 [paquete2 ...]