2010-07-06 45 views
49

我有一些函數結合了位置和關鍵字參數,我想將它們的一個參數綁定到一個給定的值(僅在函數定義之後才知道)。有沒有這樣做的一般方法?如何將參數綁定到Python函數中的給定值?

我第一次嘗試是:

def f(a,b,c): print a,b,c 

def _bind(f, a): return lambda b,c: f(a,b,c) 

bound_f = bind(f, 1) 

然而,爲了這個,我需要知道傳給f確切指定參數時,並不能使用同一個函數來約束所有我感興趣的功能(因爲他們有不同的參數列表)。

回答

74
>>> from functools import partial 
>>> def f(a, b, c): 
... print a, b, c 
... 
>>> bound_f = partial(f, 1) 
>>> bound_f(2, 3) 
1 2 3 
13

您可能需要functools的partial函數。

6

至於建議的MattH的answerfunctools.partial是要走的路。

但是,您的問題可以理解爲「我如何實施partial」。你的代碼缺少的是使用*args, **kwargs - 2這樣的用途,實際上是:

def partial(f, *args, **kwargs): 
    def wrapped(*args2, **kwargs2): 
     return f(*args, *args2, **kwargs, **kwargs2) 
    return wrapped 
0

您可以使用partialupdate_wrapper將參數綁定到給定的值和保持__name__和原有功能的__doc__

from functools import partial, update_wrapper 


def f(a, b, c): 
    print(a, b, c) 


bound_f = update_wrapper(partial(f, 1000), f) 

# This will print 'f' 
print(bound_f.__name__) 

# This will print 1000, 4, 5 
bound_f(4, 5)