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