如何比较包装函数与functools.partial?

时间:2015-09-25 15:52:34

标签: python functools

如果我定义我的功能如下:

def myfunc(arg1, arg2):
    pass

然后myfunc == myfunc将返回True

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

对于unittest目的,是否有一种简单的方法来测试部分函数是否是我期望的那个?

2 个答案:

答案 0 :(得分:9)

测试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 trackerpartial个对象添加了基本相同的对等测试,但由于没有__eq__方法影响函数的行为,它被拒绝了,如果id()匹配,它们也是相等的。

答案 1 :(得分:0)

要比较的辅助功能

def partial_functions_equal(func1, func2):
    if not (isinstance(func1, partial) and isinstance(func2, partial)):
        return False
    are_equal = all([getattr(func1, attr) == getattr(func2, attr) for attr in ['func', 'args', 'keywords']])
    return are_equal