busqueda por cualquier atributo
Josef Meile
jmeile en hotmail.com
Mar Feb 15 23:46:46 CET 2005
chaoslord (by way of Manuel <frame_256 en yahoo.com.ar>) wrote:
> Hola PythonEs, es mi primer mensaje a la lista. Hasta ahora aprendí mucho
> simplemente leyendo las preguntas y las soluciones alternativas que se
> discuten. Mi duda es la siguiente:
>
> 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.
Bueno, y por qué no defines el __init__ como:
def __init__(self,nom,ape,ID,**atrs):
self.atrs = atrs
self.atrs['nom']=nom
self.atrs['ape']=ape
self.atrs['ID']=ID
El llamado sería el mismo:
CLIS.append(Cliente(ID='C01', nom='Marta',ape='Perez', DNI=2212 ))
El orden no importa, lo que importa es que todos los argumentos
no opcionales sean incluidos. Por ejemplo, si lo llamas sin ID,
entonces el intérprete devolverá un error:
CLIS.append(Cliente(nom='Marta',ape='Perez', DNI=2212 ))
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: __init__() takes exactly 4 non-keyword arguments (3 given)
Por cierto, el código:
> def comparar(self,**args):
> salida = True
> claves = args.keys()
> for c in claves:
> if str(args[c]) not in str(self.atrs[c]):
> salida = False
> break
> return salida
Va a devolver un key error si el atributo que se busca no existe
en los atributos de la clase. Por ejemplo:
cliente=Cliente(ID='C01', nom='Marta',ape='Perez', DNI=2212 )
cliente.comparar(tel='123')
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "<stdin>", line 12, in comparar
KeyError: 'tel'
Por lo tanto te recomendaría:
def comparar(self,**args):
salida = True
claves = args.keys()
for c in claves:
if str(args[c]) not in str(self.atrs.get(c,'')):
salida = False
break
return salida
El método get funciona mejor, puesto que si el atributo no está, lo
asigna a una cadena vacía.
Saludos,
Josef
Más información sobre la lista de distribución Python-es