2012-08-06 30 views
8

functools.partial文檔說,這是「大致相當於」:是預先考慮額外的參數執行functools.partial

def partial(func, *args, **keywords): 
    def newfunc(*fargs, **fkeywords): 
     newkeywords = keywords.copy() 
     newkeywords.update(fkeywords) 
     return func(*(args + fargs), **newkeywords) # line to change 
    newfunc.func = func 
    newfunc.args = args 
    newfunc.keywords = keywords 
    return newfunc 

如果我想實現一個版本預規劃的其他參數, 似乎就像我不得不改變指定的線。

是否有任何其他功能/陷阱,我應該只是在複製這些代碼而擔心?

回答

6

看看_functoolsmodule.c的源代碼,我不認爲有太多值得擔心的地方。

partial模塊實現處理酸洗repr,但一切看起來像它的工作原理,如文檔中因此推測它用C實現的原因僅僅是爲了提高效率。還有一個事實,它是一種類型而不僅僅是一個函數閉包。

但請注意,在文檔示例中,func,argskeywords是純粹的化妝品;它們不可覆蓋,因爲它們與實際的functools.partial實例一樣。一個替代辦法是子類functools.partial

class rpartial(partial): 
    def __call__(self, *args, **kwargs): 
     kw = self.keywords.copy() 
     kw.update(kwargs) 
     return self.func(*(args + self.args), **kwargs) 
+0

沒有想到內在的內涵。 – Dave 2012-08-06 19:43:20

+0

這是偉大的,但我認爲它應該閱讀: 類rpartial(部分):DEF __call __(自我,* ARGS,** kwargs): 千瓦= self.keywords.copy() kw.update(kwargs) 返回self.func(*(args + self.args),**千瓦) – ishmael 2014-07-30 23:25:50

+0

@ishmael謝謝,修正。 – ecatmur 2014-07-31 09:18:00

0

一個缺陷,你的部分轉讓將如何處理任意參數,如下面的例子:

def f(a,b, *args): 
    pass 

現在部分適用f的參數1和2:

g = partial(f, 1, 2) 

是什麼參數b的值在g?是1還是還在等待價值?對於這個問題,a的價值是多少?換言之,提供的參數中有多少(如果有的話)應該被視爲附加參數。

+0

這是一個很好的評論,但我聲明synatax意味着'克()== F(1,2); G(X)== F(X,1,2); g(x,y)== f(x,y,1,2)'等等。這可能很奇怪,但是是系統的。 – Dave 2012-08-06 19:42:41