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

How to compare wrapped functions with functools.partial?

如果我定义我的函数如下:

def myfunc(arg1, arg2):
    pass

然后 myfunc == myfunc 将 return True

但是functools.partial(myfunc, arg2=1) == functools.partial(myfunc, arg2=1)会returnFalse

为了单元测试的目的,有没有一种简单的方法来测试偏函数是否是我期望的?

测试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__ 方法会影响 __eq__ 的行为函数,它们也只有在 id() 匹配时才相等。

要比较的辅助函数

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