2015-09-25 59 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