Re: [Python-es]RE: [Hispapyzope-zope] ¿Como quereis la Interfaz (API) de la capa de persistencia?

Ernesto Revilla aerd en retemail.es
Sab Ago 17 01:04:57 CEST 2002


> > Suponed que la clase de 'Persona' tiene los atributos 'nombre'
> > tipo string, 'apellidos' tipo string y 'edad' tipo entero.
>
> mmm.... ¿y si:
> p.edad = "cincuenta y cuatro"

Daría alguna excepción, como InvalidTypeException. Eso es porque p.edad es
una 'property' al tipo Python 2.2. al que se asocia una función set_edad que
chequea el tipo (isinstance("cincuenta y cuatro",int) daría negativo),
aunque, si quieres puedes redefinir la función en una clase heredada que
llama a una rutina de conversión.

> > # Acceder a meta-datos:
> > print "el nombre del campo es", p._class.apellidos.name
> > print " y su tipo es ", p._class.apellidos.type
> > if p._class.apellidos.validationRule:
> >     print "Regla de validación: ", p._class.apellidos.validationRule
>
> ¿a qué llamas metadatos?  ¿a los objetos que irían en la DDL (data
> definition language)?  o sea que imprimirian esas 4 ultimas lineas?
Sí. Meta-datos son datos sobre los datos ;-)

> además, ¿como se especificaría la clase Persona?
Buena pregunta: habrá un archivo de mapeo que indica qué clases hay, qué
atributos llevan, de qué tipo son y en qué mecanismo de persistencia
(sistema base de datos, tabla, campo...) hay que almacenarlo. El formato no
está claro pero sería algo como esto:

(Persona, class,
    {attributes: [
        (nombre,           string     ),
        (apellidos,         string        ),
        (edad,   integer      ),
)

Syntaxis es una tupla, donde el primer valor es el nombre (Persona), el
segundo es el tipo y el tercero un diccionario de valores. Para el caso de
'attributes' viene una lista de atributos, donde cada elemento es una tupla
igual que en la clase. La clase puede tener otros valores como si es
abstracta, si tiene una regla de validación, etc. Los atributos pueden tener
valores por defecto, reglas de validación, y para atributos que hacen
referencias a otras clases, más datos (tipo de relación).

A partir de este archivo se creará código Python para las clases como por
ejemplo:

class GenPersona(PersistentObject):
    def __init__(self):
        self._nombre=''
        self._apellidos=''
        self._edad=0

    def get_nombre(self):
        return self._nombre

    def set_nombre(self,valor):
        # La rutina de establecer atributo de PersistentObject, comprueba el
tipo
        # mediante isInstance, y la regla de validación si existe. Además
        # marca el objeto como modificado, y acutaliza el momento de la
actualización
        # hará unas cuantas cosas más.
        PersistentObject._setvalue(self,"nombre",valor)

    nombre=property(get_nombre,set_nombre)

    ... los mismo para los atributos apellidos y edad.

El texto generado nunca se modifica, porque hay que regenerarlo cada vez que
se haya modificado el archivo de mapeo de clases. Si el usuario no ha
especificado un archivo Persona.py con la clase Persona, esta se crea
automáticamente así:

class Persona(GenPersona):
    pass


Se supone que el programador modifica esta clase a su gusto.

Espero haber contestado tu pregunta. (Estas ideas salen de Webware /
MiddleKit que encontrarás en http://webware.sourceforge.net .)

Erny






Más información sobre la lista de distribución Python-es