2009-07-07 8 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 

EDIT

デコレータが示唆されました。その場合には、それは次のようになります。

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を提供していません(それについては数兆もありません!) –

関連する問題