domingo, 21 de septiembre de 2014

Tutorial de Python parte 14 - Crear módulos




Bienvenid@s, hoy veremos una de las partes esenciales de la programación en Python. Los módulos son fundamentales para crear aplicaciones organizadas correctamente, un lenguaje de programación debe contener las herramientas necesarias para la multitud de problemas que nos podemos encontrar a la hora de programar, los módulos proporcionan esas herramientas, a demás de proporcionarlas, permiten que la aplicación se distribuya de un modo estructural correcto, es decir, de una forma modular, imaginen tener que escribir toda una aplicación en un sólo script, se convertiría en algo emborronoso y nada aconsejable, los módulos nos permiten también eso, tener una organización estructurada de la aplicación.

Los módulos deben ir organizados en carpetas o paquetes según lo queramos llamar, un módulo lleva la extensión .py y contiene en su interior una serie de elementos en concreto: clases, funciones, variables que se encargan de realizar determinadas tareas, por ejemplo, un paquete de módulos puede estar destinado a proporcionar herramientas para realizar operaciones matemáticas, otro paquete de módulos, para proporcionar herramientas para el envío de emails, otro paquete para conectar a bases de datos, etc...

Python ya proporciona una serie de módulos nativos, también podemos incluir módulos de terceros, los módulos son importados a través de la palabra import, por ejemplo, el módulo sys es un módulo propio de Python y ya vimos un pequeño ejemplo con él, cuando vimos como pasar argumentos en la línea de comandos ...

import sys

script = sys.argv[0]
print(script) #retorna el script .py ejecutandose actualmente


Los módulos son llamados a través de su namespace, es decir, importamos el módulo a través del nombre dado al script python.

Supongamos que queremos crear un módulo que contenga una serie de elementos que nos permitan realizar operaciones matemáticas. Lo primero que haremos es crear la carpeta donde alojaremos el módulo, a esta carpeta la podemos llamar "modulos", en el interior de esta carpeta tendremos que crear un archivo con el siguiente nombre: __init__.py en este script no es necesario incluir nada, este script indica a Python de que en esta carpeta se encuentra módulos.

A continuación, crearemos en el interior de la carpeta "modulos" un módulo al cual llamaremos matematicas.py y le agregaremos el siguiente código con una serie de funciones para sumar, restar, multiplicar y dividir ...


def sumar(*arg):
 sumar = arg[0]
 for val in arg[1:]:
  sumar += val
 return sumar
 
def restar(*arg):
 restar = arg[0]
 for val in arg[1:]:
  restar -= val
 return restar

def multiplicar(*arg):
 multiplicar = arg[0]
 for val in arg[1:]:
  multiplicar *= val
 return multiplicar

def dividir(n1, n2):
 return n1 / n2

Ok, ahora en la raiz de la carpeta donde tenemos alojados nuestros scripts python, crearemos un script python para importar este módulo matematicas y poder realizar operaciones con las funciones proporcionadas por el mismo, a este script lo podemos llamar, "importar-modulos.py",  ...


#ejemplo 1 accediendo a traves del namespace del modulo
#incluimos el nombre de la carpeta y el nombre del modulo
import modulos.matematicas
#observa como accedemos a la funcion sumar
print(modulos.matematicas.sumar(10, 10, 10)) #regresa 30


También podemos acceder podemos incluir un alias al namespace, ahora en lugar de acceder a los elementos a través del namespace lo haremos a través del alias asignado ...

#ejemplo 2 agregando un alias al namespace del modulo
import modulos.matematicas as m
#ahora accedemos a traves del alias m
print(m.restar(10, 3, 2)) #regresa 5


También podemos acceder a todos los elementos sin tener que porque utilizar el namespace ...

#ejemplo 3 acceder a todos los elementos sin incluir el namespace, el asterico significa que podemos acceder
#a todos los elementos del modulo
from modulos.matematicas import *
print(multiplicar(2, 2, 2, 2)) #regresa 16


Seleccionar sólo determinados elementos del módulo sin utilizar el namespace, en este caso sólo importaremos la función sumar, si queréis agregar más elementos separen estos por comas, ejemplo: sumar, restar, dividir ...

#ejemplo 4 acceder a un determinado elemento del modulo sin utilizar el namespace
from modulos.matematicas import sumar
print(dividir(10, 2)) #regresa 5.0

Asignar alias a los elementos seleccionados del módulo, en este caso accederemos al elementos a través del alias asignado ...

#ejemplo 5 agregando un alias a los elementos para evitar duplicidades
from modulos.matematicas import sumar as s, restar as r 
print(s(1, 1, 1, 1, 1)) #regresa 5
print(r(20, 10, 5)) #regresa 5