Is there any way to check if two objects have the same values, other than to iterate through their attributes and manually compare their values?
object1.__dict__ == object2.__dict__
Should be all you need, I think...
Edit: vars(object1) == vars(object2)
is perhaps a bit more pythonic, though @delnan makes a valid point about objects (e.g. int
s) that don't have a __dict__
. I disagree that a custom __eq__
is a better approach for simple cases, though... Sometimes it's not worth the effort to go beyond quick and dirty, if quick and dirty perfectly does what you need, i.m.h.o.
To expound on delnan's answer:
_NOTFOUND = object()
class Rational(object):
def __eq__(self, other):
for attr in ['numerator', 'denominator']:
v1, v2 = [getattr(obj, attr, _NOTFOUND) for obj in [self, other]]
if v1 is _NOTFOUND or v2 is _NOTFOUND:
return False
elif v1 != v2:
return False
return True
@Joe Kington's solutions works if there is a __dict__
(some objects, including builtins, don't have one) and __eq__
works for all values of both dicts (a badly written __eq__
mayraise exceptions etc). But it is horribly unpythonic. It doesn't even handle nominal subtypes properly... much less structural subtypes (i.e. types that you can use in place/for duck-typing). Do not do this.
But usually you're better off with a hand-tailored __eq__
method that only compares some attributes that are significant. E.g. Rational should only compare numerator and denominator, nothing more.
You can compare namedtuple directly.
Otherwise you have to define either your own rich comparisons __eq__
and possibly __ne__
or your own __cmp__
see the datamodel for more info