Estoy tratando de crear un objeto personalizado que se comporte correctamente en las operaciones de conjunto.Comportamiento del objeto en operaciones de conjunto
Generalmente lo tengo funcionando, pero quiero asegurarme de que entiendo completamente las implicaciones. En particular, estoy interesado en el comportamiento cuando hay datos adicionales en el objeto que no están incluidos en los métodos de igualdad/hash. Parece que en la operación 'intersección', devuelve el conjunto de objetos que se están comparando, donde las operaciones 'unión' devuelve el conjunto de objetos que se están comparando.
Para ilustrar:
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
¿Es este comportamiento documentado en alguna parte y determinista? Si es así, ¿cuál es el principio rector?
En cuanto a la documentación para el método __hash__, no parece indicar que no puede haber datos en el objeto que no es hash. Puedo pensar en muchos ejemplos donde 2 objetos que son equivalentes tienen alguna forma de metadatos (una marca de tiempo o un nombre de archivo, tal vez) que son diferentes. De los documentos para __hash__: la única propiedad requerida es que los objetos que se comparan por igual tengan el mismo valor hash; se recomienda mezclar de alguna manera (por ejemplo, utilizando exclusivo o) los valores hash para los componentes del objeto que también desempeñan un papel en la comparación de los objetos. –
Estoy confundido por su comentario, parece que está de acuerdo conmigo. Si un objeto tiene metadatos (como una marca de tiempo o un nombre de archivo) que son ignorados por eq y hash, entonces no son lo suficientemente importantes como para que los guarden, ya sea que los comparen los objetos. Si fueran lo suficientemente importantes como para distinguir los dos objetos, se incluirían en el algoritmo hash y eq. ¿Qué estás preguntando en este punto? – hlfrk414
No estoy de acuerdo con usted;). Solo trato de entender cómo se pueden usar estas características. En este caso, un agente de supervisión crea objetos. Intentando correlacionar las condiciones de alerta recurrentes, que tienen diferentes marcas de tiempo. Preferiría conservar los objetos más antiguos, pero por supuesto puedo implementarlo de muchas otras maneras, porque sospecho que tienes razón. –