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