Подтвердить что ты не робот

Сравнение двух объектов

Есть ли способ проверить, имеют ли два объекта одни и те же значения, кроме того, чтобы выполнять итерацию по их атрибутам и вручную сравнивать их значения?

4b9b3361

Ответ 1

Решения

@Joe Kington работают, если есть __dict__ (некоторые объекты, включая встроенные, не имеют одного), а __eq__ работает для всех значений обоих dicts (плохо записанных исключений __eq__ mayraise и т.д.), Но это ужасно неряшливо. Он даже не обрабатывает номинальные подтипы должным образом... гораздо менее структурные подтипы (т.е. Типы, которые вы можете использовать на месте/для утиной печати). Не делайте этого.

Но обычно вам лучше использовать ручной метод __eq__, который сравнивает только некоторые существенные атрибуты. Например. Rational должен сравнивать только числитель и знаменатель, не более того.

Ответ 2

Чтобы изложить ответ на delnan:

_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

Ответ 3

Вы можете сравнить namedtuple напрямую.
В противном случае вы должны определить либо свои собственные богатые сравнения __eq__ и, возможно, __ne__
или ваш собственный __cmp__

см. datamodel для получения дополнительной информации

Ответ 4

object1.__dict__ == object2.__dict__ Должно быть все, что вам нужно, я думаю...

Изменить: vars(object1) == vars(object2), возможно, немного больше pythonic, хотя @delnan делает правильную точку об объектах (например, int s), у которых нет __dict__. Я не согласен с тем, что пользовательский __eq__ является лучшим подходом для простых случаев, хотя... Иногда это не стоит того, чтобы выходить за рамки быстрой и грязной, если бы быстро и грязно было прекрасно, что вам нужно, i.m.h.o.