2009-04-01 9 views
2

メソッドとメソッドのパラメータを別のメソッドに渡す最も良い方法はありますか?メソッド(パラメータ付き)をPythonの別のメソッドに渡す最も良い方法は何ですか

次のような方法がありますか?

def method1(name) 
    return 'Hello ' + name 

def method2(methodToCall, methodToCallParams, question): 
    greetings = methodToCall(methodToCallParams) 
    return greetings + ', ' + question 

method2(method1, 'Sam', 'How are you?') 
+0

これで何をしようとしていますか?なぜメソッドとパラメータを渡すのですか?なぜメソッドを呼び出すとそれで済むのでしょうか? –

+0

これは悪い例ですが、私のmethod2は実際にはtryメソッドです。それはmethod1 x時間を呼び出すと失敗します。私は試してみるためにさまざまなメソッドを渡すことができるようにtryintをヘルパーメソッドにしています – Dan

答えて

3

def method1(name): 
    def wrapper(): 
     return 'Hello ' + name 
    return wrapper 

def method2(method, question): 
    output = method() 
    return output + ', ' + question 

method2(method1(name = 'Sam'), 'How are you?') 

をあなたはもちろんの方法でいくつかの変数を渡すことができます()あまりにも呼び出し:

def method1(name): 
    def wrapper(greeting): 
     return greeting + name 
    return wrapper 

def method2(method, question): 
    output = method(greeting = 'Hello ') 
    return output + ', ' + question 

method2(method1(name = 'Sam'), 'How are you?') 
+0

素晴らしい..それは完全に動作します – Dan

+0

functools.partialはこれを行うためのよりクリーンな方法です。 –

0

あなたは、後で呼び出すために関数と引数をバインドするカリングを考えています。通常、関数が実際に呼び出された時点で引数を追加できるように、curryingが使用されます。

ホイールを書き換えるのではなく、http://code.activestate.com/recipes/52549/という例へのリンクがあります。

しかし、疑問に思ったことが本当に簡単な場合は、argsのリストを定位置パラメーターとして、またはkwargのリストを別の関数に渡すことができます。

def method1(name): 
    return 'Hello %s' % name 

args = ['Joe'] 
method1(*args) 

def method1a(name=None, salutation=None): 
    return 'Hello %s %s' % (name, salutation) 

kwargs = {'name':'Joe', 'salutation':'Mr'} 
method1a(**kwargs) 
+0

これは本当に質問に答えるものではありません。あなたは、引数をパックしアンパックする方法を示しているだけで、関数にバインドしてそれを関数として渡す方法ではありません。 – jkp

11

使用すると、1本のヒットで呼び出しをパッケージ化する場合は、functoolsモジュールを使用することができます。

from functools import partial 

def some_function(param_one, param_two): 
    print "Param One: %s" % param_one 
    print "Param Two: %s" % param_two 

def calling_function(target): 
    target() 

calling_function(partial(some_function, "foo", "bar")) 

あなたはこのようなだけで、いくつかのパラメータを結合として、あまりにもfunctools.partialでtweakierことを行うことができます新しい署名付きの関数が残されます。それはそれを使用するために多くのケースで過労ですが、それは確かにそれを持っています。あなたはそれをこのように行うことができます

+0

これはまさに私がPython 2.4を使っていることを除いて私が探しているものです。これは2.6が必要です。(もっと良い答えが得られなければ、私はあなたの答えを受け入れるでしょう – Dan

+0

functools.partialとほぼ同等の関数を作成して、Pythonバージョン2.5より前のバージョンで使用するようにしてください。@ jkpの答えと合わせて、ジョブを完成させるべきです。 – Jay

1

別のオプション、あなたは、Pythonで作業している場合バージョン事前2.5クロージャとしてラムダを使用することである。

def some_func(bar): 
    print bar 

def call_other(other): 
    other() 

call_other(lambda param="foo": some_func(param)) 

HTH

+0

私は戻り値を必要とします..しかし、私はそれがまだ素晴らしい答えです – Dan

2

あなたはしかしjkp pointed out

として、これを行うためにfunctools.partialを使用することができ、functoolsので、このコードはfunctools.partial用のPythonドキュメントである(私は、次のコードを使用し、過去にこれを処理するために、Pythonの2.5で新たに追加されました、 実際には)。

# functools is Python 2.5 only, so we create a different partialfn if we are 
# running a version without functools available 
try: 
    import functools 
    partialfn = functools.partial 
except ImportError: 
    def partialfn(func, *args, **keywords): 
     def newfunc(*fargs, **fkeywords): 
      newkeywords = keywords.copy() 
      newkeywords.update(fkeywords) 
      return func(*(args + fargs), **newkeywords) 
     newfunc.func = func 
     newfunc.args = args 
     newfunc.keywords = keywords 
     return newfunc 
関連する問題