A continuaci�n se presenta el listado �ntegro del m�dulo que implementa la capa de datos.
#agendadb.py import anydbm #Gesti�n de datos persistentes import string #Gesti�n de cadenas de texto import pickle #Conversi�n de objetos a cadena (serializaci�n) class agenda: def __init__(self,fich='agenda.db'): self.db=anydbm.open(fich,'c') #Abrimos la BD al instanciar el objeto def encuentra(self, clave): #B�squeda r�pida clave=string.upper(str(clave)) try: #Recuperamos el objeto a partir de la representaci�n interna return pickle.loads(self.db[clave]) except: #Si no se encuentra, se devuelve None (el nulo de Python) return None def busca(self, clave): #B�squeda lenta, por contenido ret=[] clave=string.upper(str(clave)) for k in self.db.keys(): if string.find(k,clave)>-1: #A�adimos el elemento al resultado ret.append( (k,pickle.loads(self.db[k])) ) return ret def nuevo(self,clave,contenido): #Nuevo elemento de la BD nombre=string.upper(str(clave)) #Las claves independientes de mays/minus picContenido=pickle.dumps(contenido) #Convertimos lo que venga a cadena self.db[nombre]=picContenido #Lo guardamos en la BD con su clave if __name__=='__main__': #No es un m�dulo, hacemos una prueba unitaria ag=agenda() if not ag.db: #Agenda vac�a, metemos contenido inicial ag.nuevo('ErnestoBKE', ('Ernesto Molina','[email protected]')) ag.nuevo('Ernesto', ('Ernesto Molina','[email protected]')) ag.nuevo('MarcosBKE', ('Marcos S�nchez','[email protected]')) ag.nuevo('Marcos', ('Marcos S�nchez','[email protected]')) print ag.encuentra('Ernesto') #Recuperamos unos cuantos datos print ag.busca('BKE') |
No se ha incluido en este m�dulo nada de c�digo de interfaz, salvo lo trivial de print, que presenta en la consola texto sin formato.
El m�dulo pickle es responsable de la serializaci�n, es decir, convertir a cadena (de manera reversible) cualquier objeto. pickle es muy flexible y normalmente funciona sin tener que preocuparse de c�mo lo hace.
De momento, es posible pasar a la base de datos cualquier objeto y cualquier clave. Es costumbre en Python dejar cuantas m�s caracter�sticas posibles abiertas, para no restringir la utilidad de los m�dulos para un uso posterior.
Python dispone de interfaces de datos muy variadas, desde la interfaz minimalista que vemos aqu�, hasta el acceso a servidores de datos multidimensionales. Cuenta con bibliotecas nativas para los servidores m�s comunes y con puentes con ODBC/JDBC para cubrir el resto de los servidores.
Si es la primera vez que ves un listado en Python, habr�s observado que los niveles de anidamiento se marcan simplemente por el margen izquierdo.
No es necesario declarar las variables, aunque es ilegal utilizarlas sin asignarles anteriormente un valor. Los tipos de las variables en Python se determinan en el instante en que se definen asign�ndoles su valor.
Se utiliza el latiguillo if __name__=='__main__': para detectar que el m�dulo est� actuando como programa aut�nomo. Se acostumbra a poner funciones de prueba del propio m�dulo en este caso (si el m�dulo no tiene una utilidad por s� solo).
El argumento self de los m�todos indica el propio objeto, a la manera de this (Java) o Me (Visual Basic). En Python este argumento es expl�cito y no se puede omitir en ning�n caso.