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