Есть ли способ проверить, имеют ли два объекта одни и те же значения, кроме того, чтобы выполнять итерацию по их атрибутам и вручную сравнивать их значения?
Сравнение двух объектов
Ответ 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.