2012-02-12 3 views
2

일부 함수를 단일 값으로 호출하여 전체 결과를 반환하고자합니다.여러 함수를 호출하고 집합 결과를 반환하십시오.

class Foo: 
    def __init__(self, i): 
     self.i = i 

    def get(self): 
     return self.fn1(self.fn2(self.i)) #200 

    def fn1(self, i): 
     return i + i #10+10 = 20 

    def fn2(self, i): 
     return i * i #20*20 = 200 

    #... 

foo = Foo(10) 
print(foo.get()) 

더 우아한 방법이나 패턴이 있습니까?

+0

을 정말. 이게 뭐가 잘못 됐어? –

+0

@ S.Lott, 특히 좋지는 않습니다. 특히 다음과 같은 몇 가지 메소드를 추가하면 더욱 좋습니다 :'self.fn1 (self.fn2 (self.i) (self.i)))' – tomas

+0

나는 메타 클래스를 사용할 생각입니다. .. 그러나 그것은 아마 그렇게 단순한 일에 너무 "미친"것입니다. –

답변

2

일반적으로 위와 같이 중첩 기능은 Python에서 함수를 작성하는 가장 직접적이고 읽기 쉬운 방법입니다.

당신이 많은 기능을 구성하는 경우

, 그것은 compose 함수를 작성 가치가있을 수도 있습니다.

def compose(*funcs): 
    if len(funcs) == 1: 
     return funcs[0] 
    else: 
     def composition(*args, **kwargs): 
      return funcs[0](compose(*funcs[1:])(*args, **kwargs)) 
     return composition 

또는 재귀 솔루션을 통해 반복을 선호하는 경우 :

def compose_pair(f1, f2): 
    def composition(*args, **kwargs): 
     return f1(f2(*args, **kwargs)) 
    return composition 

def compose_iterative(*funcs): 
    iterfuncs = iter(funcs) 
    comp = next(iterfuncs) 
    for f in iterfuncs: 
     comp = compose_pair(comp, f) 
    return comp 
+0

당신은 절대적으로 옳습니다. _ 가변 개수의 인수를 가진 _ 컴포지션 _을 의미했습니다 ._ – tomas

3

여기를 조금 개선하려고합니다.

def fn1(i): 
    return i + i #10+10 = 20 

def fn2(i): 
    return i * i #20*20 = 200 

def get(i): 
    funcs = [fn2, fn1] 
    for f in funcs: 
     i = f(i) 
    return i 

print(get(10)) 
+0

예, 저 역시 처음으로 발생했습니다. 확실하지 않지만 데코레이터를 사용하면 더 쉬울 수 있습니까? – tomas

+1

@tomas : 확실히 쉽지는 않습니다. 데코레이터를 멋지게 사용하는 방법을 생각할 수 없습니다. –

1

당신은 장식 스타일 솔루션을 사용할 수

class Base() 

    def __init__(self, decorated): 
     self.decorates = decorated 

    def foo(self, arg): 
     if self.decorates: 
      arg = self.decorates.foo(arg) 

     return self._do_foo(arg) 

    def _do_foo(self, arg): 
     return arg 

귀하의 구현이 자료에서 상속 _do_foo을 구현합니다(). 당신은 아래와 같이 설정

a = Subclass(None) 
b = AnotherSublcass(a) 
c = YetAnotherSubclass(b) 

Sublcasses 모든 자료에서 상속합니다. c.foo (arg)를 호출하면 세 가지 _do_foo() 메소드를 모두 통과 한 결과를 얻게됩니다.

2

개인적으로 가장 좋아하는 파이썬 함수 중 두 가지는 map과 reduce입니다.

def get(i): 
    return reduce(lambda acc, f: f(acc), [i,fn2,fn1]) 

def fn1(i): 
    return i + i #10+10 = 20 

def fn2(i): 
    return i * i #20*20 = 200 

print(get(10)) # 200 
관련 문제