Crear clases dinamicamente

nocreyente nocreyentes en terra.es
Mar Ene 2 23:35:13 CET 2007


Oswaldo Hernández escribió:
> CVA escribió:
>> Hola a todos. Al ver el "Subject" del mail, me surgio la duda: Cual 
>> es la utilidad o en que casos seria necesario o beneficioso crear una 
>> nueva clase en tiempo de ejecución?
>>
>
> Mi interes por hacerlo esta facilitarme a nivel de aplicación la 
> gestión de excepciones de PostgreSQL (psycopg2)
>
> Explico lo que estoy tratando de realizar:
>
> Tengo una diccionario de tuplas con sq1state, nombre de clase de error 
> y descipcion "entendible":
>
> ERRORESPG = {
>     "23505" : ("unique_violation", "Intento de duplicar un registro 
> que ya existe."),
>     "23514" : ("check_violation", "El valor no cumple las condiciones 
> impuestas.")
>     etc ...
> }
>
>
> Una clase base de Errores
> class PgError(Exception):
>     def __init__(self, baseError, msg = "Excepcion en base de datos", 
> Detalles = ""):
>         self.ErrorOriginal = baseError
>         self.msg = msg + Detalles
>     def __str__(self):
>         return self.msg
>
> Una función para gestionar este diccionario que recibe el error 
> original y lo transforma en otro mas  detallado, como la excepcion 
> debe ser una clase, la crea dinámicamente y la devuelve como nueva 
> clase de error:
>
> def CheckErrorBD(error, detalle = ""):   
>     # crear clase
>     if hasattr(error, "pgcode"):
>             # crear la clase
>             exec "class %s(PgError): pass" % (ERRORESPG[error.pgcode][0],)
                #Realmente no se como se haria. Es una idea a lo 
comentado al final.
               exec "class %s(PgError, %s): pass" % 
(ERRORESPG[error.pgcode][0], error.__class__.__name__)
>
>         # devolver la instancia personalizada
>         return eval("%s(error, '%s', detalle)" % 
> (ERRORESPG[error.pgcode][0], ERRORESPG[error.pgcode][1]))
>
>     return PgError(error)
>     
>
> Cierto es que en este caso podría haber definido directamente las +- 
> 100 clases de error que existen, pero esta solución me parecía mas 
> 'pythonica' :)
>
>
> Se admite cualquier tipo de sugerencia.
>
Desde el punto de vista pythonico, creo que no hay que olvidar la 
jerarquia de excepciones propuesta en 
http://www.python.org/dev/peps/pep-0249/

Jerarquia que, por cierto, respeta psycopg2 y que me parece que te estas 
cargando. El tener un conjunto de excepciones de grano fino, me parece 
una idea estupenda, pero creo que lo correcto es mantener una jerarquia 
y que el usuario de la libreria elija el grano que quiera. Y si es con 
mensajes chulos, mejor ;-)



Un saludo y suerte con tu proyecto.




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