Una clase define __eq__ pero no __hash__. ¿Qué pasa cuando añades una instancia a un set?
Opciones
- Usa el hash de identidad por defecto
- TypeError: unhashable type (Opción correcta)
- Funciona, pero se permiten duplicados
- Usa
__eq__para calcular un hash
Respuesta
TypeError: unhashable type
Por qué
Los sets y las claves de diccionario encuentran objetos por su hash (un número calculado a partir del objeto).
La regla es: los objetos iguales deben tener el mismo hash. Cuando escribes tu propio __eq__, Python no puede asegurar que el hash anterior siga cumpliendo esa regla, así que asigna __hash__ = None.
El objeto pasa a ser unhashable y añadirlo a un set lanza TypeError. Define __hash__ con los mismos campos que comparas en __eq__.
Recuerda
Si sobrescribes __eq__ → define también __hash__ si necesitas sets o claves de dict.