@@ -229,87 +229,6 @@ a: list[str] = [1, 2, 3]
229229b: set[int ] = {1 , 2 , " 3" }
230230```
231231
232- ## Literal annnotations are respected
233-
234- ``` toml
235- [environment ]
236- python-version = " 3.12"
237- ```
238-
239- ``` py
240- from enum import Enum
241- from typing_extensions import Literal, LiteralString
242-
243- a: list[Literal[1 ]] = [1 ]
244- reveal_type(a) # revealed: list[Literal[1]]
245-
246- b: list[Literal[True ]] = [True ]
247- reveal_type(b) # revealed: list[Literal[True]]
248-
249- c: list[Literal[" a" ]] = [" a" ]
250- reveal_type(c) # revealed: list[Literal["a"]]
251-
252- d: list[LiteralString] = [" a" , " b" , " c" ]
253- reveal_type(d) # revealed: list[LiteralString]
254-
255- e: list[list[Literal[1 ]]] = [[1 ]]
256- reveal_type(e) # revealed: list[list[Literal[1]]]
257-
258- class Color (Enum ):
259- RED = " red"
260-
261- f: dict[list[Literal[1 ]], list[Literal[Color.RED ]]] = {[1 ]: [Color.RED , Color.RED ]}
262- reveal_type(f) # revealed: dict[list[Literal[1]], list[Color]]
263-
264- class X[T]:
265- def __init__ (self , value : T): ...
266-
267- g: X[Literal[1 ]] = X(1 )
268- reveal_type(g) # revealed: X[Literal[1]]
269-
270- h: X[int ] = X(1 )
271- reveal_type(h) # revealed: X[int]
272-
273- i: dict[list[X[Literal[1 ]]], set[Literal[b " a" ]]] = {[X(1 )]: {b " a" }}
274- reveal_type(i) # revealed: dict[list[X[Literal[1]]], set[Literal[b"a"]]]
275-
276- j: list[Literal[1 , 2 , 3 ]] = [1 , 2 , 3 ]
277- reveal_type(j) # revealed: list[Literal[1, 2, 3]]
278-
279- k: list[Literal[1 ] | Literal[2 ] | Literal[3 ]] = [1 , 2 , 3 ]
280- reveal_type(k) # revealed: list[Literal[1, 2, 3]]
281-
282- type Y[T] = list[T]
283-
284- l: Y[Y[Literal[1 ]]] = [[1 ]]
285- reveal_type(l) # revealed: list[Y[Literal[1]]]
286-
287- m: list[tuple[Literal[1 ], Literal[2 ], Literal[3 ]]] = [(1 , 2 , 3 )]
288- reveal_type(m) # revealed: list[tuple[Literal[1], Literal[2], Literal[3]]]
289-
290- n: list[tuple[int , str , int ]] = [(1 , " 2" , 3 ), (4 , " 5" , 6 )]
291- reveal_type(n) # revealed: list[tuple[int, str, int]]
292-
293- o: list[tuple[Literal[1 ], ... ]] = [(1 , 1 , 1 )]
294- reveal_type(o) # revealed: list[tuple[Literal[1], ...]]
295-
296- p: list[tuple[int , ... ]] = [(1 , 1 , 1 )]
297- reveal_type(p) # revealed: list[tuple[int, ...]]
298-
299- # literal promotion occurs based on assignability, an exact match is not required
300- q: list[int | Literal[1 ]] = [1 ]
301- reveal_type(q) # revealed: list[int]
302-
303- r: list[Literal[1 , 2 , 3 , 4 ]] = [1 , 2 ]
304- reveal_type(r) # revealed: list[Literal[1, 2, 3, 4]]
305-
306- s: list[Literal[1 ]]
307- s = [1 ]
308- reveal_type(s) # revealed: list[Literal[1]]
309- (s := [1 ])
310- reveal_type(s) # revealed: list[Literal[1]]
311- ```
312-
313232## Generic constructor annotations are understood
314233
315234``` toml
@@ -352,17 +271,25 @@ from dataclasses import dataclass
352271class Y[T]:
353272 value: T
354273
355- y1: Y[Any] = Y(value = 1 )
356- reveal_type(y1) # revealed: Y[Any]
274+ y1 = Y(value = 1 )
275+ reveal_type(y1) # revealed: Y[int]
276+
277+ y2: Y[Any] = Y(value = 1 )
278+ reveal_type(y2) # revealed: Y[Any]
357279```
358280
359281``` py
360282class Z[T]:
283+ value: T
284+
361285 def __new__ (cls , value : T):
362286 return super ().__new__ (cls )
363287
364- z1: Z[Any] = Z(1 )
365- reveal_type(z1) # revealed: Z[Any]
288+ z1 = Z(1 )
289+ reveal_type(z1) # revealed: Z[int]
290+
291+ z2: Z[Any] = Z(1 )
292+ reveal_type(z2) # revealed: Z[Any]
366293```
367294
368295## PEP-604 annotations are supported
@@ -481,7 +408,7 @@ def f[T](x: T) -> list[T]:
481408 return [x]
482409
483410a = f(" a" )
484- reveal_type(a) # revealed: list[Literal["a"] ]
411+ reveal_type(a) # revealed: list[str ]
485412
486413b: list[int | Literal[" a" ]] = f(" a" )
487414reveal_type(b) # revealed: list[int | Literal["a"]]
@@ -495,10 +422,10 @@ reveal_type(d) # revealed: list[int | tuple[int, int]]
495422e: list[int ] = f(True )
496423reveal_type(e) # revealed: list[int]
497424
498- # error: [invalid-assignment] "Object of type `list[Literal["a"] ]` is not assignable to `list[int]`"
425+ # error: [invalid-assignment] "Object of type `list[str ]` is not assignable to `list[int]`"
499426g: list[int ] = f(" a" )
500427
501- # error: [invalid-assignment] "Object of type `list[Literal["a"] ]` is not assignable to `tuple[int]`"
428+ # error: [invalid-assignment] "Object of type `list[str ]` is not assignable to `tuple[int]`"
502429h: tuple[int ] = f(" a" )
503430
504431def f2[T: int ](x: T) -> T:
@@ -603,7 +530,7 @@ def f3[T](x: T) -> list[T] | dict[T, T]:
603530 return [x]
604531
605532a = f(1 )
606- reveal_type(a) # revealed: list[Literal[1] ]
533+ reveal_type(a) # revealed: list[int ]
607534
608535b: list[Any] = f(1 )
609536reveal_type(b) # revealed: list[Any]
@@ -619,11 +546,11 @@ reveal_type(e) # revealed: list[Any]
619546
620547f: list[Any] | None = f2(1 )
621548# TODO : Better constraint solver.
622- reveal_type(f) # revealed: list[Literal[1] ] | None
549+ reveal_type(f) # revealed: list[int ] | None
623550
624551g: list[Any] | dict[Any, Any] = f3(1 )
625552# TODO : Better constraint solver.
626- reveal_type(g) # revealed: list[Literal[1]] | dict[Literal[1], Literal[1] ]
553+ reveal_type(g) # revealed: list[int] | dict[int, int ]
627554```
628555
629556We currently prefer the generic declared type regardless of its variance:
@@ -662,8 +589,8 @@ x4 = invariant(1)
662589
663590reveal_type(x1) # revealed: Bivariant[Literal[1]]
664591reveal_type(x2) # revealed: Covariant[Literal[1]]
665- reveal_type(x3) # revealed: Contravariant[Literal[1] ]
666- reveal_type(x4) # revealed: Invariant[Literal[1] ]
592+ reveal_type(x3) # revealed: Contravariant[int ]
593+ reveal_type(x4) # revealed: Invariant[int ]
667594
668595x5: Bivariant[Any] = bivariant(1 )
669596x6: Covariant[Any] = covariant(1 )
0 commit comments