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