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