@@ -116,3 +116,126 @@ def func_c1(x: Union[int, Callable[[Unpack[Ts1]], None]]) -> Tuple[Unpack[Ts1]]:
116
116
# reveal_type(func_c1(callback1)) # Revealed type is "builtins.tuple[str]" # TODO
117
117
# reveal_type(func_c1(2)) # Revealed type is "builtins.tuple[builtins.int, builtins.str]" # TODO
118
118
[builtins fixtures/tuple.pyi]
119
+
120
+ [case testTypeVarDefaultsClass1]
121
+ from typing import Generic, TypeVar
122
+
123
+ T1 = TypeVar("T1")
124
+ T2 = TypeVar("T2", default=int)
125
+ T3 = TypeVar("T3", default=str)
126
+
127
+ class ClassA1(Generic[T2, T3]): ...
128
+
129
+ def func_a1(
130
+ a: ClassA1,
131
+ b: ClassA1[float],
132
+ c: ClassA1[float, float],
133
+ d: ClassA1[float, float, float], # E: "ClassA1" expects between 0 and 2 type arguments, but 3 given
134
+ ) -> None:
135
+ reveal_type(a) # N: Revealed type is "__main__.ClassA1[builtins.int, builtins.str]"
136
+ reveal_type(b) # N: Revealed type is "__main__.ClassA1[builtins.float, builtins.str]"
137
+ reveal_type(c) # N: Revealed type is "__main__.ClassA1[builtins.float, builtins.float]"
138
+ reveal_type(d) # N: Revealed type is "__main__.ClassA1[builtins.int, builtins.str]"
139
+
140
+ class ClassA2(Generic[T1, T2, T3]): ...
141
+
142
+ def func_a2(
143
+ a: ClassA2,
144
+ b: ClassA2[float],
145
+ c: ClassA2[float, float],
146
+ d: ClassA2[float, float, float],
147
+ e: ClassA2[float, float, float, float], # E: "ClassA2" expects between 1 and 3 type arguments, but 4 given
148
+ ) -> None:
149
+ reveal_type(a) # N: Revealed type is "__main__.ClassA2[Any, builtins.int, builtins.str]"
150
+ reveal_type(b) # N: Revealed type is "__main__.ClassA2[builtins.float, builtins.int, builtins.str]"
151
+ reveal_type(c) # N: Revealed type is "__main__.ClassA2[builtins.float, builtins.float, builtins.str]"
152
+ reveal_type(d) # N: Revealed type is "__main__.ClassA2[builtins.float, builtins.float, builtins.float]"
153
+ reveal_type(e) # N: Revealed type is "__main__.ClassA2[Any, builtins.int, builtins.str]"
154
+
155
+ [case testTypeVarDefaultsClass2]
156
+ from typing import Generic, ParamSpec
157
+
158
+ P1 = ParamSpec("P1")
159
+ P2 = ParamSpec("P2", default=[int, str])
160
+ P3 = ParamSpec("P3", default=...)
161
+
162
+ class ClassB1(Generic[P2, P3]): ...
163
+
164
+ def func_b1(
165
+ a: ClassB1,
166
+ b: ClassB1[[float]],
167
+ c: ClassB1[[float], [float]],
168
+ d: ClassB1[[float], [float], [float]], # E: "ClassB1" expects between 0 and 2 type arguments, but 3 given
169
+ ) -> None:
170
+ reveal_type(a) # N: Revealed type is "__main__.ClassB1[[builtins.int, builtins.str], ...]"
171
+ reveal_type(b) # N: Revealed type is "__main__.ClassB1[[builtins.float], ...]"
172
+ reveal_type(c) # N: Revealed type is "__main__.ClassB1[[builtins.float], [builtins.float]]"
173
+ reveal_type(d) # N: Revealed type is "__main__.ClassB1[[builtins.int, builtins.str], ...]"
174
+
175
+ class ClassB2(Generic[P1, P2]): ...
176
+
177
+ def func_b2(
178
+ a: ClassB2,
179
+ b: ClassB2[[float]],
180
+ c: ClassB2[[float], [float]],
181
+ d: ClassB2[[float], [float], [float]], # E: "ClassB2" expects between 1 and 2 type arguments, but 3 given
182
+ ) -> None:
183
+ reveal_type(a) # N: Revealed type is "__main__.ClassB2[Any, [builtins.int, builtins.str]]"
184
+ reveal_type(b) # N: Revealed type is "__main__.ClassB2[[builtins.float], [builtins.int, builtins.str]]"
185
+ reveal_type(c) # N: Revealed type is "__main__.ClassB2[[builtins.float], [builtins.float]]"
186
+ reveal_type(d) # N: Revealed type is "__main__.ClassB2[Any, [builtins.int, builtins.str]]"
187
+
188
+ [case testTypeVarDefaultsClass3]
189
+ from typing import Generic, Tuple, TypeVar
190
+ from typing_extensions import TypeVarTuple, Unpack
191
+
192
+ T1 = TypeVar("T1")
193
+ T3 = TypeVar("T3", default=str)
194
+
195
+ Ts1 = TypeVarTuple("Ts1")
196
+ Ts2 = TypeVarTuple("Ts2", default=Unpack[Tuple[int, str]])
197
+ Ts3 = TypeVarTuple("Ts3", default=Unpack[Tuple[float, ...]])
198
+ Ts4 = TypeVarTuple("Ts4", default=Unpack[Tuple[()]])
199
+
200
+ class ClassC1(Generic[Unpack[Ts2]]): ...
201
+
202
+ def func_c1(
203
+ a: ClassC1,
204
+ b: ClassC1[float],
205
+ ) -> None:
206
+ # reveal_type(a) # Revealed type is "__main__.ClassC1[builtins.int, builtins.str]" # TODO
207
+ reveal_type(b) # N: Revealed type is "__main__.ClassC1[builtins.float]"
208
+
209
+ class ClassC2(Generic[T3, Unpack[Ts3]]): ...
210
+
211
+ def func_c2(
212
+ a: ClassC2,
213
+ b: ClassC2[int],
214
+ c: ClassC2[int, Unpack[Tuple[()]]],
215
+ ) -> None:
216
+ reveal_type(a) # N: Revealed type is "__main__.ClassC2[builtins.str, Unpack[builtins.tuple[builtins.float, ...]]]"
217
+ # reveal_type(b) # Revealed type is "__main__.ClassC2[builtins.int, Unpack[builtins.tuple[builtins.float, ...]]]" # TODO
218
+ reveal_type(c) # N: Revealed type is "__main__.ClassC2[builtins.int]"
219
+
220
+ class ClassC3(Generic[T3, Unpack[Ts4]]): ...
221
+
222
+ def func_c3(
223
+ a: ClassC3,
224
+ b: ClassC3[int],
225
+ c: ClassC3[int, Unpack[Tuple[float]]]
226
+ ) -> None:
227
+ # reveal_type(a) # Revealed type is "__main__.ClassC3[builtins.str]" # TODO
228
+ reveal_type(b) # N: Revealed type is "__main__.ClassC3[builtins.int]"
229
+ reveal_type(c) # N: Revealed type is "__main__.ClassC3[builtins.int, builtins.float]"
230
+
231
+ class ClassC4(Generic[T1, Unpack[Ts1], T3]): ...
232
+
233
+ def func_c4(
234
+ a: ClassC4,
235
+ b: ClassC4[int],
236
+ c: ClassC4[int, float],
237
+ ) -> None:
238
+ reveal_type(a) # N: Revealed type is "__main__.ClassC4[Any, Unpack[builtins.tuple[Any, ...]], builtins.str]"
239
+ # reveal_type(b) # Revealed type is "__main__.ClassC4[builtins.int, builtins.str]" # TODO
240
+ reveal_type(c) # N: Revealed type is "__main__.ClassC4[builtins.int, builtins.float]"
241
+ [builtins fixtures/tuple.pyi]
0 commit comments