← Back to index

dataclasses_hash.py

True Positive
False Positive
False Negative
Optional (detected)
Warning or Info
TP: 2
FP: 0
FN: 2
Optional: 0 / 0
1"""
2Tests the synthesis of the __hash__ method in a dataclass.
3"""
4
5from dataclasses import dataclass
6from typing import Callable, Hashable, assert_type
7
8
9@dataclass
10class DC1:
11 a: int
14assert_type(DC1.__hash__, None)
16# These should generate errors because DC1 isn't hashable.
17DC1(0).__hash__() # E
[call-non-callable] Object of type `None` is not callable
18v1: Hashable = DC1(0) # E
Expected a ty diagnostic for this line
21@dataclass(eq=True, frozen=True)
22class DC2:
23 a: int
26dc2_hash: Callable[..., int] = DC2.__hash__ # OK
27DC2(0).__hash__() # OK
28v2: Hashable = DC2(0) # OK
31@dataclass(eq=True)
32class DC3:
33 a: int
36assert_type(DC3.__hash__, None)
38# These should generate errors because DC3 isn't hashable.
39DC3(0).__hash__() # E
[call-non-callable] Object of type `None` is not callable
40v3: Hashable = DC3(0) # E
Expected a ty diagnostic for this line
43@dataclass(frozen=True)
44class DC4:
45 a: int
48dc4_hash: Callable[..., int] = DC4.__hash__ # OK
49DC4(0).__hash__() # OK
50v4: Hashable = DC4(0) # OK
53@dataclass(eq=True, unsafe_hash=True)
54class DC5:
55 a: int
58dc5_hash: Callable[..., int] = DC5.__hash__ # OK
59DC5(0).__hash__() # OK
60v5: Hashable = DC5(0) # OK
63@dataclass(eq=True)
64class DC6:
65 a: int
67 def __hash__(self) -> int:
68 return 0
71dc6_hash: Callable[..., int] = DC6.__hash__ # OK
72DC6(0).__hash__() # OK
73v6: Hashable = DC6(0) # OK
76@dataclass(frozen=True)
77class DC7:
78 a: int
80 def __eq__(self, other) -> bool:
81 return self.a == other.a
84dc7_hash: Callable[..., int] = DC7.__hash__ # OK
85DC7(0).__hash__() # OK
86v7: Hashable = DC7(0) # OK