Nehmen wir an, wir haben die folgende Python-Klasse (das Problem existiert in Java genauso mit equals
und hashCode
)
class Temperature:
def __init__(self, degrees):
self.degrees = degrees
Wo degrees
ist die Temperatur in Kelvin als Schwimmer. Nun würde Ich mag Gleichheit Prüfung und Hashing implementieren Temperature
in einer Weise , dass
- vergleicht Floats mit einer Epsilon-Differenz anstatt direkter Gleichheitsprüfung,
- und hält den Vertrag ein, der
a == b
implizierthash(a) == hash(b)
.
def __eq__(self, other):
return abs(self.degrees - other.degrees) < EPSILON
def __hash__(self):
return # What goes here?
In der Python-Dokumentation wird ein wenig über das Hashing von Zahlen gesprochen, um sicherzustellen, dass hash(2) == hash(2.0)
dies nicht ganz dasselbe Problem ist.
Bin ich überhaupt auf dem richtigen Weg? Und wenn ja, wie wird Hashing in dieser Situation standardmäßig implementiert?
Update : Jetzt verstehe ich, dass diese Art der Gleichheitsprüfung für Schwimmer die Transitivität von ==
und beseitigt equals
. Aber wie passt das zu dem "Allgemeinwissen", dass Schwimmkörper nicht direkt miteinander verglichen werden sollten? Wenn Sie einen Gleichheitsoperator durch Vergleichen von Floats implementieren, beklagen sich statische Analysetools. Haben sie Recht dazu?
kelvin
?