2016-07-21 13 views
1

別の関数に(関数を呼び出さずに)関数を渡す必要がありますが、デフォルトの引数に別の値を指定する必要があります。例えば関数を実行しないでPython関数のデフォルトの引数を解析する

def func_a(input, default_arg=True): 
    pass 

def func_b(function): 
    pass 

func_b(func_a(default_arg=False)) 

これは、しかしながら、func_a()を呼び出し、func_b()に結果を渡します。

を実行しないでdefault_arg=Falseを設定するにはどうすればよいですか?

+0

は' func_b'しか 'input'を渡します。ところで、 'input'は組み込みの' input'関数を陰にするので、変数名の良い選択ではありません。 –

答えて

2

は、ラムダ関数を使用します。このように:

func_b(lambda input: func_a(input, default_arg=False)) 

func_bであなたは、引数の入力を受け入れ、以前に指定default_arg引数でfunc_aを実行呼び出し可能functionを持つことになります。

EDITED:これを行うための唯一の正しい方法があることを私たちに言おうとしているcdarkeから

感謝。

from functools import partial, wraps 

def func_wrapper(f, **kwargs): 
    @wraps(f) 
    def wrapper(input): 
     return f(input, **kwargs) 
    return wrapper 

func_b(func_wrapper(func_a, default_arg=False)) 
それは `func_a`呼び出すか、また` func_b`があまりに `default_arg`を上書きする可能性を処理する必要がないとき
+1

'lambda'sには' __name__'や '__doc__'属性はありません。 'func_b'でそれらのどちらかが必要かどうかわかりません。 – cdarke

+0

@cdarkeコメントありがとう – frist

4

functools.partial() object使用します。

from functools import partial 

func_b(partial(func_a, default_arg=False)) 

partial()オブジェクトがあまりにも呼び出し可能である、と呼ばれるとき、それはあなたの最初の引数にそれを与えた引数を適用します。

デモ:

>>> from functools import partial 
>>> def func_a(input, default_arg=True): 
...  print('func_a() called with {!r}, and default_arg={!r}'.format(input, default_arg)) 
... 
>>> def func_b(function): 
...  print('Calling the function') 
...  function('Foo bar') 
... 
>>> func_b(partial(func_a, default_arg=False)) 
Calling the function 
func_a() called with 'Foo bar', and default_arg=False 
+0

'partial'オブジェクトには' __name__'または__doc__'属性がありません。それが問題になるかどうかはわかりませんが、 'functools.update_wrapper()'を使って軽減できます。 – cdarke

+1

@cdarke:確かに、あなたは 'partial()'インスタンスに属性を追加することができます。オブジェクトの 'repr()'出力には使われません。 –

関連する問題