Powiedzmy, że mamy następującą klasę Python (problem istnieje w Javie tak samo z equals
i hashCode
)
class Temperature:
def __init__(self, degrees):
self.degrees = degrees
gdzie degrees
jest temperatura w kelwinach jako liczba zmiennoprzecinkowa. Teraz chciałbym wdrożyć testy równości i mieszanie Temperature
w taki sposób
- porównuje wartości zmienne do różnicy epsilon zamiast bezpośrednich testów równości,
- i honoruje umowę, która
a == b
implikujehash(a) == hash(b)
.
def __eq__(self, other):
return abs(self.degrees - other.degrees) < EPSILON
def __hash__(self):
return # What goes here?
Dokumentacja Pythona mówi trochę o liczbach mieszających, aby się upewnić, hash(2) == hash(2.0)
ale nie jest to ten sam problem.
Czy w ogóle jestem na dobrej drodze? A jeśli tak, to jaki jest standardowy sposób implementacji haszowania w tej sytuacji?
Aktualizacja : Teraz rozumiem, że ten rodzaj testowania równości dla liczb zmiennoprzecinkowych eliminuje przechodniość ==
i equals
. Ale jak to idzie w parze z „powszechną wiedzą”, że pływa, nie należy bezpośrednio porównywać? Jeśli zaimplementujesz operator równości poprzez porównanie liczb zmiennoprzecinkowych, narzędzia analizy statycznej będą narzekać. Czy mają rację?
kelvin
?