Crear clases dinamicamente

Alexis Roda alexis.roda.villalonga en gmail.com
Mar Ene 2 21:59:33 CET 2007


En/na Oswaldo Hernández ha escrit:
> 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:

Las excepciones también pueden ser instancias. Dependiendo de tus 
necesidades podrías instanciar PgError directamente en lugar de crear 
una clase para cada error.

El "problema" de este enfoque monoclase es que en un try ... except ... 
no puedes distinguir la causa del error, todos son PgError. En la 
práctica no se si realmente es necesaria esta granularidad tan fina a la 
hora de distinguir excepciones. Personalmente encuentro problemático 
tratar de controlar todos los errores que se pueden producir al hacer un 
simple update, por ejemplo:

try:
   # ejecutar update
except unique_violation, check_violation, error de sintaxis SQL, funcion 
no definida, campo no existente, formato de fecha erróneo, error en 
trigger, error de E/S ...

mas teniendo en cuenta que posiblemente el programa no pueda hacer nada 
cuando se produce una excepción, aparte de informar del error y abortar 
la ejecución. ¿ Que ocurrirá cuando los desarrolladores de postgres 
incluyan un nuevo error y tu no lo reflejes en ERRORESPG ?



Por lo que respecta a la pregunta original, te recomendaría utilizar 
new.classobj():

clase_error = new.classobj("unique_violation", (PgError, ), {})
instancia = clase_error(error, msg, detalle)




Saludos




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