Katakanlah kita memiliki kelas Python berikut (masalahnya ada di Jawa sama dengan equals
dan hashCode
)
class Temperature:
def __init__(self, degrees):
self.degrees = degrees
di mana degrees
suhu di Kelvin sebagai pelampung. Sekarang, saya ingin menerapkan pengujian kesetaraan dan hashing Temperature
dengan cara itu
- membandingkan mengapung hingga perbedaan epsilon alih-alih pengujian kesetaraan langsung,
- dan menghormati kontrak yang
a == b
menyiratkanhash(a) == hash(b)
.
def __eq__(self, other):
return abs(self.degrees - other.degrees) < EPSILON
def __hash__(self):
return # What goes here?
Dokumentasi Python berbicara sedikit tentang hashing angka untuk memastikan itu hash(2) == hash(2.0)
tetapi ini bukan masalah yang sama.
Apakah saya bahkan berada di jalur yang benar? Dan jika demikian, apa cara standar untuk menerapkan hashing dalam situasi ini?
Pembaruan : Sekarang saya mengerti bahwa jenis pengujian kesetaraan untuk pelampung ini menghilangkan transitivitas ==
dan equals
. Tetapi bagaimana hal itu sejalan dengan "pengetahuan umum" yang mengapung tidak harus dibandingkan secara langsung? Jika Anda menerapkan operator kesetaraan dengan membandingkan pelampung, alat analisis statis akan mengeluh. Apakah mereka benar?
kelvin
?