from dataclasses import dataclass @dataclass class ThreeDPoint: x: int | float y = 0.0 z: int | float = 0.0 point_1 = ThreeDPoint(1.0,2) point_3 = ThreeDPoint(1,2) print(point_1 == point_3)
The result is true.
I ran it in python playground. The result said it is true. I think this dataclass module might play some magic trick inside but I am not sure what is exactly happening.
There is no magic trick. In Python, integer 1 and float 1.0 are the same
> 1 == 1.0 True
On the other hand, type(1) is not the same as type(1.0)
> type(1) == type(1.0) False
If you would like the equality operator to behave the way you suggested (= returning False when x has the same value but different type), then you could define your own equality method for the class, like so:
from dataclasses import dataclass @dataclass class ThreeDPoint: x: int | float y = 0.0 z: int | float = 0.0 def __eq__(self, other): for var, var_value in self.__dict__.items(): try: other_var_value = getattr(other, var) if not (var_value == other_var_value and type(var_value) is type(other_var_value)): return False except AttributeError: return False return True point_1 = ThreeDPoint(1.0, 2) point_3 = ThreeDPoint(1, 2) print(point_1 == point_3)