10

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

def myfunc(arg1, arg2):
    pass

然后myfunc == myfunc将返回True

functools.partial(myfunc, arg2=1) == functools.partial(myfunc, arg2=1)会回来False

出于单元测试的目的,是否有一种简单的方法来测试部分函数是否是我所期望的?

4

2 回答 2

12

测试func,argskeywords属性是否相同:

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

Python 跟踪器中存在一个错误,用于向基本上执行此操作的对象添加相等性测试partial,但它被拒绝了,因为没有__eq__方法会影响函数的行为,这些函数也只有在它们id()匹配时才相等。

于 2015-09-25T15:54:30.640 回答
2

比较的辅助函数

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
于 2018-07-13T08:04:56.173 回答