Disons que nous avons la classe Python suivante (le problème existe en Java tout comme avec equalset hashCode)
class Temperature:
def __init__(self, degrees):
self.degrees = degrees
où degreesest la température en Kelvin sous forme de flotteur. Maintenant, je voudrais implémenter le test d'égalité et le hachage d' Temperatureune manière qui
- compare les flottants à une différence epsilon au lieu de tests d'égalité directs,
- et honore le contrat que cela
a == bimpliquehash(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?