次のPythonクラスがあるとしましょう(問題はJavaにもequalsandと同じように存在します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ませんか?