Diciamo che abbiamo la seguente classe Python (il problema esiste in Java lo stesso con equals
e hashCode
)
class Temperature:
def __init__(self, degrees):
self.degrees = degrees
dove si degrees
trova la temperatura in Kelvin come galleggiante. Ora, vorrei implementare test di uguaglianza e hashing per Temperature
in questo modo
- confronta i galleggianti con una differenza epsilon invece del test di uguaglianza diretta,
- e onora il contratto che
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 documentazione di Python parla un po 'di numeri di hashing per garantire che hash(2) == hash(2.0)
questo non sia esattamente lo stesso problema.
Sono anche sulla buona strada? E se è così, qual è il modo standard per implementare l'hash in questa situazione?
Aggiornamento : ora capisco che questo tipo di test di uguaglianza per i float elimina la transitività di ==
e equals
. Ma in che modo ciò va di pari passo con la "conoscenza comune" che i galleggianti non devono essere confrontati direttamente? Se si implementa un operatore di uguaglianza confrontando i float, gli strumenti di analisi statica si lamenteranno. Hanno ragione a farlo?
kelvin
?