Digamos que temos a seguinte classe Python (o problema existe em Java da mesma forma com equals
e hashCode
)
class Temperature:
def __init__(self, degrees):
self.degrees = degrees
onde degrees
está a temperatura em Kelvin como um flutuador. Agora, eu gostaria de implementar testes de igualdade e hash de Temperature
uma maneira que
- compara flutuações até uma diferença de épsilon em vez de testes diretos de igualdade,
- e honra o contrato que
a == b
implicahash(a) == hash(b)
.
def __eq__(self, other):
return abs(self.degrees - other.degrees) < EPSILON
def __hash__(self):
return # What goes here?
A documentação do Python fala um pouco sobre números de hash para garantir isso, hash(2) == hash(2.0)
mas esse não é o mesmo problema.
Estou no caminho certo? E se sim, qual é a maneira padrão de implementar o hash nessa situação?
Atualização : Agora entendo que esse tipo de teste de igualdade para carros alegóricos elimina a transitividade de ==
e equals
. Mas como isso se combina com o "conhecimento comum" que flutua não deve ser comparado diretamente? Se você implementar um operador de igualdade comparando flutuadores, as ferramentas de análise estática irão reclamar. Eles estão certos em fazer isso?
kelvin
?