Я пытаюсь создать пользовательский объект, который корректно ведет себя в заданных операциях.
Как правило, это работает, но я хочу убедиться, что полностью понимаю последствия. В частности, меня интересует поведение, когда в объекте есть дополнительные данные, которые не включены в методы равенства/хэша. Кажется, что в операции "пересечения" он возвращает набор объектов, которые сравниваются, когда операции "union" возвращают набор сравниваемых объектов.
Чтобы проиллюстрировать:
class MyObject:
def __init__(self,value,meta):
self.value = value
self.meta = meta
def __eq__(self,other):
return self.value == other.value
def __hash__(self):
return hash(self.value)
a = MyObject('1','left')
b = MyObject('1','right')
c = MyObject('2','left')
d = MyObject('2','right')
e = MyObject('3','left')
print a == b # True
print a == c # False
for i in set([a,c,e]).intersection(set([b,d])):
print "%s %s" % (i.value,i.meta)
#returns:
#1 right
#2 right
for i in set([a,c,e]).union(set([b,d])):
print "%s %s" % (i.value,i.meta)
#returns:
#1 left
#3 left
#2 left
Является ли это поведение документированным где-то и детерминированным? Если да, то каков руководящий принцип?