2017-09-16 60 views
1

我刚写了一个python项目的测试脚本,我发现检查两个对象的值是否相等并不像foo == bar那么简单。例如,我有一个对象dashboard具有大熊猫数据帧作为一个属性,所以我定义其__eq__方法为:是否有一种测试Python中两个对象的属性是否等价的通用方法?

def __eq__(self, other): 
    vals = [self.__dict__[k] == other.__dict__[k] for k in self.__dict__.keys()] 
    vals = [v if isinstance(v, bool) else all(v) for v in vals] 
    return all(vals) 

它比较每个对象的字典,并且如果任何这些比较的产生比其他东西一个布尔值(例如,一个数据帧)它应用all()将其减少为一个布尔值。然后,我将all()应用于整个属性比较列表,以测试selfother的每个属性是否等同。

我在几个类中使用了这个__eq__定义,并且在我的父类Test类中也使用了类似的比较方法。我让我的测试工作,但我很好奇,如果有一个更优雅/有效的方式来处理这个问题。 (免责声明:测试对我来说是新的,以及一般的OOP。)

+0

你谈论测试:你应该使用像单元测试,或Pytest测试框架;这些有很多内置函数来完成这种事情。 – MrE

回答

0

不,没有测试对象相等的一般方法。

这部分是因为自定义/任意对象对于平等的含义有着广泛的不同解释。例如,在你的代码中,你定义的平等意味着“值是布尔值和/或布尔值的迭代和所有值都同意”,但是这个规则只适用于两个字典都有共同的键。其他人可能需要检查字典是否具有所有相同的键,但不关心这些值,或者所有键和所有值都是相同的以及特定数据类型等。因此,这由用户来执行。

相关问题