Crear clases dinamicamente
Oswaldo Hernández
listas en soft-com.es
Mar Ene 2 20:00:07 CET 2007
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],)
# 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.
--
*****************************************
Oswaldo Hernández
oswaldo (@) soft-com (.) es
*****************************************
Más información sobre la lista de distribución Python-es