La capa de datos

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')
    

Comentarios al listado

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.