Допустим, у нас есть следующий класс Python (проблема существует в Java точно так же с equals
и hashCode
)
class Temperature:
def __init__(self, degrees):
self.degrees = degrees
где degrees
температура в Кельвинах как поплавок. Теперь я хотел бы реализовать тестирование на равенство и хэширование Temperature
таким образом, чтобы
- сравнивает поплавки с разницей в эпсилон вместо прямого тестирования на равенство,
- и соблюдает контракт, который
a == b
подразумеваетhash(a) == hash(b)
.
def __eq__(self, other):
return abs(self.degrees - other.degrees) < EPSILON
def __hash__(self):
return # What goes here?
Документация Python говорит немного о хэшировании чисел, чтобы гарантировать это, hash(2) == hash(2.0)
но это не совсем та же проблема.
Я даже на правильном пути? И если да, то каков стандартный способ реализации хеширования в этой ситуации?
Обновление : теперь я понимаю, что этот тип проверки на равенство для поплавков устраняет транзитивность ==
и equals
. Но как это сочетается с «общеизвестным», что поплавки не должны сравниваться напрямую? Если вы реализуете оператор равенства путем сравнения чисел с плавающей запятой, инструменты статического анализа будут жаловаться. Правы ли они на это?
kelvin
?