Digamos que tenemos la siguiente clase de Python (el problema existe en Java igual que con equals
y hashCode
)
class Temperature:
def __init__(self, degrees):
self.degrees = degrees
¿Dónde degrees
está la temperatura en Kelvin como flotador? Ahora, me gustaría implementar pruebas de igualdad y hashing de Temperature
una manera que
- compara flotadores hasta una diferencia de épsilon en lugar de pruebas de igualdad directa,
- y honra el contrato que
a == b
implicahash(a) == hash(b)
.
def __eq__(self, other):
return abs(self.degrees - other.degrees) < EPSILON
def __hash__(self):
return # What goes here?
La documentación de Python habla un poco sobre los números hash para asegurar eso, hash(2) == hash(2.0)
pero este no es exactamente el mismo problema.
¿Estoy incluso en el camino correcto? Y si es así, ¿cuál es la forma estándar de implementar hashing en esta situación?
Actualización : ahora entiendo que este tipo de prueba de igualdad para flotadores elimina la transitividad de ==
y equals
. Pero, ¿cómo va eso junto con el "conocimiento común" de que los flotadores no deben compararse directamente? Si implementa un operador de igualdad comparando flotantes, las herramientas de análisis estático se quejarán. ¿Tienen razón para hacerlo?
kelvin
?