2015-09-25 60 views
5

如果我定義如下我的功能:如何比較包裝函數與functools.partial?

def myfunc(arg1, arg2): 
    pass 

然後myfunc == myfunc將返回True

functools.partial(myfunc, arg2=1) == functools.partial(myfunc, arg2=1)將返回False

對於單元測試的目的,有沒有簡單的方法來測試部分函數是否是我期望的?

回答

8

測試如果funcargskeywords屬性是相同的:

p1.func == p2.func and p1.args == p2.args and p1.keywords == p2.keywords 

其中p1p2都是partial()對象:

>>> from functools import partial 
>>> def myfunc(arg1, arg2): 
...  pass 
... 
>>> partial(myfunc, arg2=1).func == partial(myfunc, arg2=1).func 
True 
>>> partial(myfunc, arg2=1).args == partial(myfunc, arg2=1).args 
True 
>>> partial(myfunc, arg2=1).keywords == partial(myfunc, arg2=1).keywords 
True 

有一個bug filed in the Python tracker平等的測試添加到partial實質上是這樣的對象,但它被拒絕的理由是沒有__eq__方法會影響函數的行爲,如果它們的id()匹配,這些函數也是相同的。

+1

爲什麼'functools.partial'對象沒有在標準的'__eq__'中實現這個對象嗎? – doublep