iman453
iman453

Reputation: 9535

Comparing two objects

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

Answers (4)

user395760
user395760

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

Joe Kington
Joe Kington

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. ints) 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

John La Rooy
John La Rooy

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

habnabit
habnabit

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

Related Questions