Diciamo che abbiamo la seguente classe Python (il problema esiste in Java lo stesso con equalse hashCode)
class Temperature:
def __init__(self, degrees):
self.degrees = degrees
dove si degreestrova la temperatura in Kelvin come galleggiante. Ora, vorrei implementare test di uguaglianza e hashing per Temperaturein questo modo
- confronta i galleggianti con una differenza epsilon invece del test di uguaglianza diretta,
- e onora il contratto che
a == bimplicahash(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?