2009-07-07 2 views
1

예 :여러 함수 호출을 추상화하는 우아한 방법?

>>> def write_to_terminal(fmt, *args): 
...  print fmt % args 
>>> LOG = logging.getLogger(__name__) 
>>> info = multicall(write_to_terminal, LOG.info) 
>>> debug = multicall(write_debug_to_terminal, LOG.debug) 
>>> ... 
>>> info('Hello %s', 'guido') # display in terminal *and* log the message 

multicall를 작성하는 우아한 방법이 있나요? 아마도 표준 라이브러리의 도움으로 .. 바퀴를 다시 발명하지 않고?

+0

? 나는 콘솔에 쓰는 별도의 모듈 ('ui.py'라고 부름)을 작성했기 때문에 로깅을 사용하여 로그를 남겼다. 종종 콘솔에 인쇄 할 메시지도 기록됩니다. –

+1

이렇게하기 위해 로깅 모듈을 구성 할 수 있습니다. 해당 수준의 여러 핸들러 및/또는 로거를 사용하십시오. –

+0

로깅 모듈은 텍스트 UI 용으로 설계되지 않았으며 사용자와 상호 작용합니다. 예 : write_to_terminal은 이미 표시된 진행 막대와 상호 작용할 수 있으며 심지어 숨길 수도 있습니다. (그냥 bzr 않습니다) –

답변

5

이와 비슷한?

def multicall(*functions): 
    def call_functions(*args, **kwds): 
     for function in functions: 
      function(*args, **kwds) 
    return call_functions 

그리고 당신은 결과를 집계 할 경우 :

def multicall(*functions): 
    def call_functions(*args, **kwds): 
     return [function(*args, **kwds) for function in functions] 
    return call_functions 

편집

장식이 제안되었다; 이 경우 그 결과는 다음과 같습니다

def appendcalls(*functions): 
    def decorator(decorated_function): 
     all_functions = [decorated_function] + list(functions) 
     def call_functions(*args, **kwds): 
      for function in all_functions: 
       function(*args, **kwds) 
     return call_functions 
    return decorator 


LOG = logging.getLogger(__name__) 

@appendcalls(LOG.info) 
def info(fmt, *args): 
    print fmt % args 

info('Hello %s', 'guido') 

appendcalls()은 장식 기능 후에 호출되는 기능의 수를합니다. 원하는 반환 값에 따라 데코레이터를 다르게 구현할 수 있습니다. 데코 레이팅 된 함수의 원본, 모든 함수 결과의 목록 또는 전혀 아예 없습니다.

+0

'functools '조차도이 글을 쓰지 않아도되는 것처럼 보입니다. –

+0

사실, 원래의'info' (필자의 경우'write_to_terminal')를 유지하고 LOG를 호출하지 않는 기존 버전에 * 추가하여 새로운 정보 (LOG를 호출) *를 제공하려고합니다. '@ appendcalls'는 원래 함수를 유지하지 않습니다. 예를 들어, 한 함수를 다른 함수에 "추가"하고 싶지는 않지만 같은 인수를 전달하는 N 개의 다른 함수를 호출하는 * new * 함수를 만듭니다. –

+0

@snd,이 경우 데코레이터 (정의에 의해 장식하는 함수의 이름을 재 지정)를 사용할 수 없으며 @ Steef의 대답의 첫 번째 부분 (편집 :)이 사용자가 찾고있는 것입니다. 그리고 functools는 거의 필요하지 않고 쉽게 쓸 수있는 HOF를 제공하지 않습니다. (그 외에도 1 조도 안됩니다!) –

1

파이썬 장식을 들여다 볼 수 있습니다.

명확한 설명

은 여기에 있습니다 : 내가 왜이 일을하고 http://www.artima.com/weblogs/viewpost.jsp?thread=240808

+0

+1 데코레이터에 대한 탁월한 사용법과 비슷합니다. –

+0

데코레이터를 정확히 적용하는 방법 하나 이상의 기능 이상? –

관련 문제