Foros del Web » Programando para Internet » Python »

comparacion de datos, duda novatilla

Estas en el tema de comparacion de datos, duda novatilla en el foro de Python en Foros del Web. Hola lista tengo una duda. Debo realizar una funcion que compare los atributos de una clase con un diccionario, tipo: def comparacion(self, diccionario): return (diccionario['aaa'] ...
  #1 (permalink)  
Antiguo 22/03/2011, 13:19
 
Fecha de Ingreso: agosto-2008
Mensajes: 198
Antigüedad: 16 años, 3 meses
Puntos: 27
comparacion de datos, duda novatilla

Hola lista tengo una duda. Debo realizar una funcion que compare los atributos de una clase con un diccionario, tipo:

def comparacion(self, diccionario):
return (diccionario['aaa'] != self.aaa or diccionario['bbb] != self.bbb or diccionario['ccc'] != self.ccc or diccionario['ddd'] != self.ddd or .............................)

¿Existe alguna manera más compacta de escribir la sentencia de comparación, ya que no estoy muy familiarizado co esas instrucciones más reducidas?

P.D.: Los atributos de la clase no están en un diccionario. Lo otro sería pasar, previamente, los atributos a un diccionario, pero para eso mantego la comparación actual. O usar exec para invocar a 'self.llave del diccionario', pero no me agrada esa idea.

Bueno, si no hay forma, ni modo.
Saludos.
  #2 (permalink)  
Antiguo 22/03/2011, 13:25
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: comparacion de datos, duda novatilla

Si pusieras mas código o el código completo de la clase te diría como hacerlo de una forma eficiente y elegante pero con tan pocos datos es difícil saber que estas intentando hacer.
  #3 (permalink)  
Antiguo 22/03/2011, 13:47
 
Fecha de Ingreso: agosto-2008
Mensajes: 198
Antigüedad: 16 años, 3 meses
Puntos: 27
Respuesta: comparacion de datos, duda novatilla

Ok, disculpa, aqui va:
---------------------------------------------------------------------------------------------
Código:
class MiModelo(models.Model):
    nombre = models.CharField(max_length=30)
    fk_empresa = models.ForeignKey(Empresa)
    fk_cliente = models.ForeignKey(Cliente)
    fk_user_creacion = models.ForeignKey(User)
    fecha_creacion = CustomDateField(auto_now_add=True)
    fk_user_edicion = models.ForeignKey(User, null=True, blank=True, related_name='usuario_edicion')
    fecha_edicion = CustomDateField(null=True, blank=True)
    fecha_inicio = CustomDateField()
    externo = models.BooleanField(default=False)
    sector = models.CharField(max_length=70, null=True, blank=True)

    def obtenerAntiguo(self):
         antiguo = MiModelo.objects.get(id=self.id)
         return {'nombre':antiguo.nombre,
                      'fk_empresa':antiguo.fk_empresa,
                      'fk_cliente':antiguo.fk_cliente,
                      'sector':antiguo.sector}

    def save(self, *args, **kwargs):
        antiguo = obtenerAntiguo()
        super(MiModelo, self).save(*args, **kwargs)
        self.accion(antiguo)

   def comparacion(self, antiguo):
       return (antiguo['nombre'] != self.nombre or
                   antiguo['fk_empresa'] != self.fk_empresa or
                   antiguo['fk_cliente'] != self.fk_cliente or
                   antiguo['sector'] != self.sector)

   def accion(self, antiguo):
       if self.comparacion.antiguo:
                    .....
                    .....
--------------------------------------------------------------------------------------------
Todavía no lo programo pero algo como esto es lo que quiero.

Es la clase de un modelo en Django y en la funcion "obtenerAntiguo" obtengo algunos datos almacenados previos al UPDATE. Finalmente en "accion" , gracias a la funcion "comparacion" hago determinadas acciones si hay algún cambio en esos únicos datos.

La función que quiero reducir o hacer más genérica es comparación. Se que de momento tampoco compara pocos datos, así que lo que pido puede no parecer importante, pero mi idea es crear una clase base sin atributos, puesto que la operación la usaré en muchos modelos, cada uno con distintos atributos, algunas con muchísimos atributos.

Lo que quiero es, en cada clase hija, sobreescribir únicamente el método "obtenerAntiguo" y evitarme el reescribir "comparacion" que en algunos casos comparará contra un diccionario muy extenso.

Saludos.
  #4 (permalink)  
Antiguo 22/03/2011, 15:20
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: comparacion de datos, duda novatilla

Prueba con esto, la verdad no es muy elegante, pero es lo que pides.
Código Python:
Ver original
  1. class A:
  2.     a = 1
  3.     b = 1
  4.     c = 1
  5.    
  6.     def compara(self, antiguo):
  7.         for k, v in antiguo.iteritems():
  8.             if(v != self.__class__.__dict__[k]):
  9.                 return True
  10.         return False
  11.                
  12.    
  13. a = A()
  14. d = {'a':1, 'b':2, 'c':3}
  15. a.compara(d)
  #5 (permalink)  
Antiguo 23/03/2011, 06:11
 
Fecha de Ingreso: agosto-2008
Mensajes: 198
Antigüedad: 16 años, 3 meses
Puntos: 27
Respuesta: comparacion de datos, duda novatilla

ok, gracias.

Etiquetas: comparacion
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:14.