Disons que nous avons la classe Python suivante (le problème existe en Java tout comme avec equals
et hashCode
)
class Temperature:
def __init__(self, degrees):
self.degrees = degrees
où degrees
est la température en Kelvin sous forme de flotteur. Maintenant, je voudrais implémenter le test d'égalité et le hachage d' Temperature
une manière qui
- compare les flottants à une différence epsilon au lieu de tests d'égalité directs,
- et honore le contrat que cela
a == b
impliquehash(a) == hash(b)
.
def __eq__(self, other):
return abs(self.degrees - other.degrees) < EPSILON
def __hash__(self):
return # What goes here?
La documentation Python parle un peu de hachage des nombres pour s'assurer que, hash(2) == hash(2.0)
mais ce n'est pas tout à fait le même problème.
Suis-je même sur la bonne voie? Et si c'est le cas, quelle est la méthode standard pour implémenter le hachage dans cette situation?
Mise à jour : Je comprends maintenant que ce type de test d'égalité pour les flottants élimine la transitivité de ==
et equals
. Mais comment cela va-t-il de pair avec la «connaissance commune» selon laquelle les flotteurs ne devraient pas être comparés directement? Si vous implémentez un opérateur d'égalité en comparant les flottants, les outils d'analyse statique se plaindront. Ont-ils raison de le faire?
kelvin
?