我刚为python中的项目编写了一个测试脚本,并且我了解到检查两个对象的值是否相等并不像foo == bar
那么简单。例如,我有一个对象dashboard
,它将pandas数据帧作为属性,因此我将其__eq__
方法定义为:
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()
应用于整个属性比较列表,以测试self
和other
的每个属性是否相同。
我在几个类中使用了这个__eq__
定义,并且在我的父类Test类中也使用了类似的比较方法。我让我的测试工作,但我很好奇是否有更优雅/有效的方法来处理这个问题。 (免责声明:测试对我来说是新的,以及一般的OOP。)
答案 0 :(得分:0)
不,没有一种测试对象相等性的通用方法。
这部分是因为自定义/任意对象对平等意味着什么有不同的解释。例如,在您的代码中,您已将等式定义为“值是布尔值和/或布尔值的迭代,并且所有值都是一致的”,但此规则仅适用于两个词典共有的键。其他人可能需要检查字典是否具有所有相同的键但不关心值,或者所有键和所有值是否相同以及特定数据类型等等。因此,这留给用户实现。
答案 1 :(得分:0)
比较数据框,因为你提到这个,有:
DataFrame.equals(other)
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.equals.html