Giả sử chúng ta có lớp Python sau (vấn đề tồn tại trong Java giống với equals
và hashCode
)
class Temperature:
def __init__(self, degrees):
self.degrees = degrees
nơi degrees
là nhiệt độ trong Kelvin như một phao. Bây giờ, tôi muốn thực hiện kiểm tra và băm bình đẳng Temperature
theo cách mà
- so sánh nổi lên đến chênh lệch epsilon thay vì kiểm tra đẳng thức trực tiếp,
- và tôn vinh hợp đồng
a == b
ngụ ýhash(a) == hash(b)
.
def __eq__(self, other):
return abs(self.degrees - other.degrees) < EPSILON
def __hash__(self):
return # What goes here?
Tài liệu Python nói một chút về các số băm để đảm bảo điều đó hash(2) == hash(2.0)
nhưng đây không hoàn toàn là vấn đề tương tự.
Tôi thậm chí đang đi đúng hướng? Và nếu vậy, cách tiêu chuẩn để thực hiện băm trong tình huống này là gì?
Cập nhật : Bây giờ tôi hiểu rằng loại kiểm tra đẳng thức cho phao này giúp loại bỏ tính siêu việt của ==
và equals
. Nhưng làm thế nào mà đi cùng với "kiến thức chung" mà phao không nên được so sánh trực tiếp? Nếu bạn triển khai một toán tử đẳng thức bằng cách so sánh các float, các công cụ phân tích tĩnh sẽ khiếu nại. Họ có đúng không?
kelvin
?