如果我定义我的函数如下:
def myfunc(arg1, arg2):
pass
则myfunc == myfunc
将返回True
但functools.partial(myfunc, arg2=1) == functools.partial(myfunc, arg2=1)
将返回False
。
对于单元测试的目的,是否有一个简单的方法来测试如果部分函数是我所期望的?
测试func
, args
和keywords
属性是否相同:
p1.func == p2.func and p1.args == p2.args and p1.keywords == p2.keywords
其中p1
和p2
都是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