2016-07-21 45 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()

如何在不執行func_a的情況下設置default_arg=False

+0

將'func_b'永遠只能通過'input'當它調用'func_a',或者你還需要處理的'func_b'覆蓋'default_arg'太多的可能性。順便說一下,'input'不是變量名稱的好選擇,因爲它會隱藏內置的'input'函數。 –

回答

2

使用lambda功能。就像這樣:

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

func_b,你將有一個可調用的function它接受參數的輸入,並與先前指定default_arg參數執行func_a

編輯:

感謝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)) 
+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()'輸出中。 –

相關問題