busqueda por cualquier atributo

Chema Cortes py en ls-l.org
Mie Feb 16 09:30:14 CET 2005


chaoslord (by way of Manuel <frame_256 en yahoo.com.ar>) escribió:
> Supongamos una clase Cliente. Me gustaría saber cuál es la mejor forma de 
> realizar búsquedas por __cualquier__ atributo de la clase. La idea es que se 
> pueden especificar diferenes atributos a cada cliente, además de su numbre y 
> apellido.
> El código de abajo es un ejemplo de lo que intento. Un problema con éste es 
> que no tengo forma de controlar los atributos que se pasan. El nombre, el 
> apellido y el ID deberían ser obligatorios.
> 
> Sugerencias??

Una solución alternativa a la que te ha dado Josef sería validar los 
atributos que te llegan, pero que obligaría a pasarlos siempre por nombre:

class Cliente:
	def __init__(self,**atrs):
		attrs_obligatorios=("nom","ape","ID")
		if not set(attrs)>set(attrs_obligatorios):
			raise KeyError
		self.atrs = atrs



...y si lo quieres más elegante, se podría utilizar decoradores para 
validar "contratos" en el paso de argumentos:


def val_attrs( attrs_obligatorios ):
   def deco(func):
     def wrapper(self,**attrs):
       sdiff=set(attrs_obligatorios)-set(attrs.keys())
       if sdiff:
         raise KeyError,list(sdiff)
       return func(self,**attrs)
     return wrapper
   return deco


class Cliente:
	@val_attrs( ("nom","ape","ID") )
	def __init__(self,**atrs):
		self.atrs = atrs
...




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