[pyar] Logica repetida en metodos

Lucas Liendo mindmaster en gmail.com
Vie Dic 3 00:16:04 ART 2010


Lo que tengo es algo de la siguiente forma :

def metodo_a(self, args) :
    if condicion_a
        logica
        ....
    ....

def metodo_b(self, args) :
    if condicion_b
        logica
        ....
    ....

def metodo_c(self, args) :
    if condicion_c
        logica
        ....
    ....

Es decir luego de condicion_X la logica es la misma para todos los metodos.
Para aclararte mas el panorama lo que en realidad tengo es un diccionario,
con la siguiente forma

dict1 = {'key1' : (self.metodo_a, (args)),
'key2' : (self.metodo_b, (args)),
'key3' : (self.metodo_c, (args))}

luego esta la logica que ejecuta lo apuntado por el diccionario :

...
dict1 [key] [0] (*dict [key] [1])

Entonces no tiene sentido que tenga definido 3 metodos diferentes si
solamente lo que tienen distinto es una comparacion, entonces podria hacer
algo asi :

dict1 = {'key1' : (self.metodo_a, (cond_lambda_1)),
'key2' : (self.metodo_a, (cond_lambda_2)),
'key3' : (self.metodo_a, (cond_lambda_3))}

y el codigo de metodo_a compara el resultado de la lambda. El problema con
esto es que si en lugar de una expr lamba es un metodo, el mismo queda
evaluado de antemano, por ejemplo :

dict1 = {'key1' : (self.metodo_a, (self.otro_metodo(1,2))),
'key2' : (self.metodo_a, (self.otro_metodo(3,4))),
'key3' : (self.metodo_a, (self.otro_metodo(4,5))}

self.otro_metodo(1,2) queda por asi decirlo evaluado (o invocado) antes de
que se ejecute :

dict1 [key] [0] (*dict [key] [1])

Por lo que los valores de la tupla de argumentos siempre es constante y
justamente eso no es lo que quiero. Me explique bien ?




2010/12/2 Pablo Ziliani <pablo en kultroom.com>

> On 12/02/2010 10:55 PM, Lucas Liendo wrote:
>
>> Hola ! Queria consultarles por una duda, resulta que tengo que hacer
>> algunos metodos los cuales todos tienen la misma logica, salvo en un solo
>> punto, el cual es una condicion, para resolverlo se me ocurrio algo asi :
>>
>> def funcion_dep(cond) :
>>    if eval(cond) :
>>        print "truep"
>>    else :
>>        print "falsep"
>>
>> def condicion_1(n1, n2) :
>>    if n1 > n2 :
>>        return 1
>>
>>    return 0
>>
>> def condicion_2(n1, n2) :
>>    if n1 < n2 :
>>        return 1
>>
>>    return 0
>>
>> if __name__ == "__main__" :
>>    funcion_dep("condicion_1(1, 2)")
>>    funcion_dep("condicion_2(1, 2)")
>>
>> es decir evaluo la condicion en otro metodo a traves de eval, lo que
>> queria saber es si hay otra alternativa al eval (ya que estoy disconforme
>> con esta solucion). Bueno eso es todo !
>>
>
> Hola Lucas, no me queda claro qué querés lograr. Si en tu punto de entrada
> vas a tener siempre strings como las que en el ejemplo le estás pasando a
> funcion_dep(), estás atado a algún tipo de evaluación, con o sin eval(). Si
> el uso del eval en cambio es sólo la forma que se te ocurrió para postergar
> la ejecución de las funciones condicion_1() y condicion_2() tenés mil
> alternativas, la más simple siendo que las condiciones devuelvan una
> función, ej:
>
>
> >>> def condicion_1(n1, n2):
> ...     return lambda: n1 > n2
> ...
>
> >>> def condicion_2(n1, n2):
> ...     return lambda: n1 < n2
> ...
> >>> def funcion_dep(cond):
> ...     print "truep" if cond() else "falsep"
> ...
>
> >>> funcion_dep(condicion_1(1,2))
> falsep
> >>> funcion_dep(condicion_1(3,2))
> truep
>
> Donde ves labda podés usar cualquier función, basta que crees el closure
> anidando la definición en la condición. Yo usé lambda sólo por brevedad.
> Fijate que las condiciones se evalúan recién dentro de funcion_dep().
>
> Saludos,
> Pablo
>
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/listinfo/pyar
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>



-- 
Saludos,
Lucas.
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20101203/f4037183/attachment.html>


More information about the pyar mailing list