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



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

def myfunc(arg1, arg2):
    pass

myfunc == myfunc将返回True

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

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

测试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跟踪器中有一个bug,将相等性测试添加到partial对象中,基本上就是这样做的,但它被拒绝了,理由是没有__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

相关内容

  • 没有找到相关文章

最新更新