2010-02-17 4 views
9

기능 조성물은 내가있어 무엇 파이썬 :내가 여기 좋은 구문 함수의 합성을 구현하기 위해 노력하고 한

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 

그것은 정수와 잘 작동하지만리스트/튜플에 실패

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

print f4([1, 2]) #None 

어디에서 실수가 났습니까?

+0

내가 가정을 그 "반함"무슨 뜻으로 "충돌"? 그리고 "충돌"에 의해 나는 당신이 "예외를 던졌다"는 것을 의미한다고 생각하니? 또한 게시 한 정확한 코드를 실행하면 정상적으로 작동합니다. – porgarmingduod

+1

'f4()'가 의도 한대로 작동하지 않는 것을 보지 못했습니다. 아마도 당신은 오해의 기대를 가지고 있습니다. –

+0

감사합니다, Ignacio. 나는 정말 어리석은 실수를 저질렀다. – si14

답변

9

append은 Ignacio Vazquez-Abrams가 말했듯이 (잘, 암시 적으로) - 따라서 사용자가 함수에 return을 추가하면 문제를 해결할 수 있지만, 너무이 통과 된 인수 :

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

는 그것은 또한 새로운 개체를 생성하고 반환 더욱 간결 다음 코드를 사용하는 것이 가장 좋은 것입니다 :

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

감사합니다. 내 실수는 끔찍합니다. – si14

+1

우리는 단지 인간입니다 :) – badp

관련 문제