Reputation: 9535
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?
Upvotes: 18
Views: 30033
Reputation:
@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.
Upvotes: 11
Reputation: 284602
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.
Upvotes: -3
Reputation: 304147
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
Upvotes: 2
Reputation: 10274
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
Upvotes: 6