2016-05-24 20 views
1

はこの考えてみましょう:関数を引数に持つ関数をPythonで渡すにはどうすればいいですか?

def function1(): 
    def nestedfunc(param1, **kw): 
     logging.info("nested function %s" % kw) #error 
    function2(nestedfunc("is called"), string="not default") 


def function2(func, string="default"): 
    try: 
     #doing some setting 
     func() 
    finally: 
     #reset back to setting 

を私が取得しています:

func() 
TypeError: 'NoneType' object is not callable 

私は)(FUNCを想定していますパラメータを渡すと、それはエラーが発生していません。

明確にするために、任意の数のパラメータを追加してfunc()を呼び出すことができます。

誰でも適切な方法を知っていますか?どんなアドバイスもありがたいです!

+0

欲望の結果は、任意の数のパラメータを追加して()FUNCを呼び出すことができるようにすることです。 – tipsywacky

答えて

4

あなたfunction2 recieves func=Noneそれはパラメータ"is called"と呼ばれているnestedfunc()の(デフォルト)戻り値、だから。あなたは、いくつかの関数の引数「凍結」にfunctools.partialを使用することができます。

from functools import partial 

def function1(): 
    def nestedfunc(param1, **kw): 
     logging.info("nested function %s" % kw) #error 
    function2(partial(nestedfunc, "is called"), string="not default") 
+2

非常にいいです、 'functool.partial'は正しい方法です。 –

+0

はそれを試しました。完璧!ありがとう。 – tipsywacky

1

nestedfunc("is called")は、関数呼び出しによって返される値:Noneです。 nestedfuncfunction2に、を付けずに渡す必要があります。

nestedfuncにパラメータを渡す場合は、最初にfunction2に渡します。

def function1(): 
    def nestedfunc(param1, **kw): 
     logging.info("nested function %s" % kw) #error 
    function2(nestedfunc, "is called", string="not default") 


def function2(func, funcparam, string="default"): 
    try: 
     #doing some setting 
     func(funcparam) 
    finally: 
     #reset back to setting 
+0

これは私がやったことですが、私の目標はfunc()に任意の数のパラメータを追加することです。それが可能かどうか確かではありません。 – tipsywacky

+0

もう一つの答えはあなたが望むことをします。 –

関連する問題