Crear clases dinamicamente
Chema Cortes
pych3m4 en gmail.com
Mie Ene 3 02:49:20 CET 2007
El 2/01/07, Oswaldo Hernández<listas en soft-com.es> escribió:
> 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],)
> # devolver la instancia personalizada
> return eval("%s(error, '%s', detalle)" % (ERRORESPG[error.pgcode][0], ERRORESPG[error.pgcode][1]))
>
> return PgError(error)
Aparte de lo conveniente que sea crear así las excepciones, para crear
clases dinámicas lo aconsejado sería con type():
type(nombre,bases,diccionario)
pe:
type("MiExcepcion", (PgError,), {"msg":"Mi excepción"})
Más información sobre la lista de distribución Python-es