2010-02-17 14 views
9

He tratado de aplicar la composición de funciones con buena sintaxis y aquí es lo que tengo:Python composición de la función

from functools import partial 

class _compfunc(partial): 
    def __lshift__(self, y): 
     f = lambda *args, **kwargs: self.func(y(*args, **kwargs)) 
     return _compfunc(f) 

    def __rshift__(self, y): 
     f = lambda *args, **kwargs: y(self.func(*args, **kwargs)) 
     return _compfunc(f) 

def composable(f): 
    return _compfunc(f) 

@composable  
def f1(x): 
    return x * 2 

@composable 
def f2(x): 
    return x + 3 

@composable 
def f3(x): 
    return (-1) * x 

print f1(2) #4 
print f2(2) #5 
print (f1 << f2 << f1)(2) #14 
print (f3 >> f2)(2) #1 
print (f2 >> f3)(2) #-5 

Funciona bien con números enteros, pero falla en listas/tuplas:

@composable 
def f4(a): 
    a.append(0) 

print f4([1, 2]) #None 

¿Dónde hay un error?

+0

supongo que por "aplasta" usted se refiere "choques"? Y por "choques", supongo que te refieres a "arroja una excepción". Además, si ejecuto el código exacto que publicó, funciona bien. – porgarmingduod

+1

No veo cómo 'f4()' no funciona como está diseñado. Quizás has confundido las expectativas. –

+0

Gracias, Ignacio. He cometido un error realmente estúpido. – si14

Respuesta

9

append agrega in situ, como dijo Ignacio Vazquez-Abrams (bueno, implícita) - por lo tanto, aunque podría solucionarlo simplemente agregando un return a su función, tendría el efecto secundario de cambiar el argumento que fue aprobada, también:

@composable 
def f4(a): 
    a.append(0) 
    return a 

que sería mejor utilizar el siguiente código aún más concisa que también crea y devuelve un nuevo objeto:

@composable 
def f4(a): 
    return a + [0] 
+0

Gracias. Mi error es horrible – si14

+1

Somos humanos solo :) – badp

Cuestiones relacionadas