| [case testPEP695TypeParameterDefaultSupported] |
| class C[T = None]: ... |
| def f[T = list[int]]() -> None: ... |
| def g[**P = [int, str]]() -> None: ... |
| type A[T, S = int, U = str] = list[T] |
| |
| [case testPEP695TypeParameterDefaultBasic] |
| from typing import Callable |
| |
| def f1[T1 = int](a: T1) -> list[T1]: ... |
| reveal_type(f1) # N: Revealed type is "def [T1 = builtins.int] (a: T1`-1 = builtins.int) -> builtins.list[T1`-1 = builtins.int]" |
| |
| def f2[**P1 = [int, str]](a: Callable[P1, None]) -> Callable[P1, None]: ... |
| reveal_type(f2) # N: Revealed type is "def [P1 = [builtins.int, builtins.str]] (a: def (*P1.args, **P1.kwargs)) -> def (*P1.args, **P1.kwargs)" |
| |
| def f3[*Ts1 = *tuple[int, str]](a: tuple[*Ts1]) -> tuple[*Ts1]: ... |
| reveal_type(f3) # N: Revealed type is "def [Ts1 = Unpack[Tuple[builtins.int, builtins.str]]] (a: Tuple[Unpack[Ts1`-1 = Unpack[Tuple[builtins.int, builtins.str]]]]) -> Tuple[Unpack[Ts1`-1 = Unpack[Tuple[builtins.int, builtins.str]]]]" |
| |
| |
| class ClassA1[T1 = int]: ... |
| class ClassA2[**P1 = [int, str]]: ... |
| class ClassA3[*Ts1 = *tuple[int, str]]: ... |
| |
| reveal_type(ClassA1) # N: Revealed type is "def [T1 = builtins.int] () -> __main__.ClassA1[T1`1 = builtins.int]" |
| reveal_type(ClassA2) # N: Revealed type is "def [P1 = [builtins.int, builtins.str]] () -> __main__.ClassA2[P1`1 = [builtins.int, builtins.str]]" |
| reveal_type(ClassA3) # N: Revealed type is "def [Ts1 = Unpack[Tuple[builtins.int, builtins.str]]] () -> __main__.ClassA3[Unpack[Ts1`1 = Unpack[Tuple[builtins.int, builtins.str]]]]" |
| [builtins fixtures/tuple.pyi] |
| |
| [case testPEP695TypeParameterDefaultValid] |
| from typing import Any |
| |
| class ClassT1[T = int]: ... |
| class ClassT2[T: float = int]: ... |
| class ClassT3[T: list[Any] = list[int]]: ... |
| class ClassT4[T: (int, str) = int]: ... |
| |
| class ClassP1[**P = []]: ... |
| class ClassP2[**P = ...]: ... |
| class ClassP3[**P = [int, str]]: ... |
| |
| class ClassTs1[*Ts = *tuple[int]]: ... |
| class ClassTs2[*Ts = *tuple[int, ...]]: ... |
| [builtins fixtures/tuple.pyi] |
| |
| [case testPEP695TypeParameterDefaultInvalid] |
| class ClassT1[T = 2]: ... # E: TypeVar "default" must be a type |
| class ClassT2[T = [int]]: ... # E: Bracketed expression "[...]" is not valid as a type \ |
| # N: Did you mean "List[...]"? \ |
| # E: TypeVar "default" must be a type |
| class ClassT3[T: str = int]: ... # E: TypeVar default must be a subtype of the bound type |
| class ClassT4[T: list[str] = list[int]]: ... # E: TypeVar default must be a subtype of the bound type |
| class ClassT5[T: (int, str) = bytes]: ... # E: TypeVar default must be one of the constraint types |
| class ClassT6[T: (int, str) = int | str]: ... # E: TypeVar default must be one of the constraint types |
| class ClassT7[T: (float, str) = int]: ... # E: TypeVar default must be one of the constraint types |
| |
| class ClassP1[**P = int]: ... # E: The default argument to ParamSpec must be a list expression, ellipsis, or a ParamSpec |
| class ClassP2[**P = 2]: ... # E: The default argument to ParamSpec must be a list expression, ellipsis, or a ParamSpec |
| class ClassP3[**P = (2, int)]: ... # E: The default argument to ParamSpec must be a list expression, ellipsis, or a ParamSpec |
| class ClassP4[**P = [2, int]]: ... # E: Argument 0 of ParamSpec default must be a type |
| |
| class ClassTs1[*Ts = 2]: ... # E: The default argument to TypeVarTuple must be an Unpacked tuple |
| class ClassTs2[*Ts = int]: ... # E: The default argument to TypeVarTuple must be an Unpacked tuple |
| class ClassTs3[*Ts = tuple[int]]: ... # E: The default argument to TypeVarTuple must be an Unpacked tuple |
| [builtins fixtures/tuple.pyi] |
| |
| [case testPEP695TypeParameterDefaultInvalid2] |
| from typing import overload |
| def f1[T = 2]() -> None: ... # E: TypeVar "default" must be a type |
| def f2[T = [int]]() -> None: ... # E: Bracketed expression "[...]" is not valid as a type \ |
| # N: Did you mean "List[...]"? \ |
| # E: TypeVar "default" must be a type |
| def f3[T: str = int](x: T) -> T: ... # E: TypeVar default must be a subtype of the bound type |
| def f4[T: list[str] = list[int]](x: T) -> T: ... # E: TypeVar default must be a subtype of the bound type |
| def f5[T: (int, str) = bytes](x: T) -> T: ... # E: TypeVar default must be one of the constraint types |
| def f6[T: (int, str) = int | str](x: T) -> T: ... # E: TypeVar default must be one of the constraint types |
| def f7[T: (float, str) = int](x: T) -> T: ... # E: TypeVar default must be one of the constraint types |
| def f8[T: str = int]() -> None: ... # TODO check unused TypeVars |
| @overload |
| def f9[T: str = int](x: T) -> T: ... # E: TypeVar default must be a subtype of the bound type |
| @overload |
| def f9[T: (int, str) = bytes](x: T) -> T: ... # E: TypeVar default must be one of the constraint types |
| def f9() -> None: ... # type: ignore[misc] |
| |
| def g1[**P = int]() -> None: ... # E: The default argument to ParamSpec must be a list expression, ellipsis, or a ParamSpec |
| def g2[**P = 2]() -> None: ... # E: The default argument to ParamSpec must be a list expression, ellipsis, or a ParamSpec |
| def g3[**P = (2, int)]() -> None: ... # E: The default argument to ParamSpec must be a list expression, ellipsis, or a ParamSpec |
| def g4[**P = [2, int]]() -> None: ... # E: Argument 0 of ParamSpec default must be a type |
| |
| def h1[*Ts = 2]() -> None: ... # E: The default argument to TypeVarTuple must be an Unpacked tuple |
| def h2[*Ts = int]() -> None: ... # E: The default argument to TypeVarTuple must be an Unpacked tuple |
| def h3[*Ts = tuple[int]]() -> None: ... # E: The default argument to TypeVarTuple must be an Unpacked tuple |
| [builtins fixtures/tuple.pyi] |
| |
| [case testPEP695TypeParameterDefaultInvalid3] |
| from typing import Callable |
| |
| type TA1[T: str = 1] = list[T] # E: TypeVar "default" must be a type |
| type TA2[T: str = [int]] = list[T] # E: Bracketed expression "[...]" is not valid as a type \ |
| # N: Did you mean "List[...]"? \ |
| # E: TypeVar "default" must be a type |
| type TA3[T: str = int] = list[T] # E: TypeVar default must be a subtype of the bound type |
| type TA4[T: list[str] = list[int]] = list[T] # E: TypeVar default must be a subtype of the bound type |
| type TA5[T: (int, str) = bytes] = list[T] # E: TypeVar default must be one of the constraint types |
| type TA6[T: (int, str) = int | str] = list[T] # E: TypeVar default must be one of the constraint types |
| type TA7[T: (float, str) = int] = list[T] # E: TypeVar default must be one of the constraint types |
| |
| type TB1[**P = int] = Callable[P, None] # E: The default argument to ParamSpec must be a list expression, ellipsis, or a ParamSpec |
| type TB2[**P = 2] = Callable[P, None] # E: The default argument to ParamSpec must be a list expression, ellipsis, or a ParamSpec |
| type TB3[**P = (2, int)] = Callable[P, None] # E: The default argument to ParamSpec must be a list expression, ellipsis, or a ParamSpec |
| type TB4[**P = [2, int]] = Callable[P, None] # E: Argument 0 of ParamSpec default must be a type |
| |
| type TC1[*Ts = 2] = tuple[*Ts] # E: The default argument to TypeVarTuple must be an Unpacked tuple |
| type TC2[*Ts = int] = tuple[*Ts] # E: The default argument to TypeVarTuple must be an Unpacked tuple |
| type TC3[*Ts = tuple[int]] = tuple[*Ts] # E: The default argument to TypeVarTuple must be an Unpacked tuple |
| [builtins fixtures/tuple.pyi] |
| [typing fixtures/typing-full.pyi] |
| |
| [case testPEP695TypeParameterDefaultFunctions] |
| from typing import Callable |
| |
| def callback1(x: str) -> None: ... |
| |
| def func_a1[T = str](x: int | T) -> T: ... |
| reveal_type(func_a1(2)) # N: Revealed type is "builtins.str" |
| reveal_type(func_a1(2.1)) # N: Revealed type is "builtins.float" |
| |
| def func_a2[T = str](x: int | T) -> list[T]: ... |
| reveal_type(func_a2(2)) # N: Revealed type is "builtins.list[builtins.str]" |
| reveal_type(func_a2(2.1)) # N: Revealed type is "builtins.list[builtins.float]" |
| |
| |
| def func_a3[T: str = str](x: int | T) -> T: ... |
| reveal_type(func_a3(2)) # N: Revealed type is "builtins.str" |
| |
| def func_a4[T: (bytes, str) = str](x: int | T) -> T: ... |
| reveal_type(func_a4(2)) # N: Revealed type is "builtins.str" |
| |
| def func_b1[**P = [int, str]](x: int | Callable[P, None]) -> Callable[P, None]: ... |
| reveal_type(func_b1(callback1)) # N: Revealed type is "def (x: builtins.str)" |
| reveal_type(func_b1(2)) # N: Revealed type is "def (builtins.int, builtins.str)" |
| |
| def func_c1[*Ts = *tuple[int, str]](x: int | Callable[[*Ts], None]) -> tuple[*Ts]: ... |
| # reveal_type(func_c1(callback1)) # Revealed type is "Tuple[str]" # TODO |
| reveal_type(func_c1(2)) # N: Revealed type is "Tuple[builtins.int, builtins.str]" |
| [builtins fixtures/tuple.pyi] |
| |
| [case testPEP695TypeParameterDefaultClass1] |
| # flags: --disallow-any-generics |
| |
| class ClassA1[T2 = int, T3 = str]: ... |
| |
| def func_a1( |
| a: ClassA1, |
| b: ClassA1[float], |
| c: ClassA1[float, float], |
| d: ClassA1[float, float, float], # E: "ClassA1" expects between 0 and 2 type arguments, but 3 given |
| ) -> None: |
| reveal_type(a) # N: Revealed type is "__main__.ClassA1[builtins.int, builtins.str]" |
| reveal_type(b) # N: Revealed type is "__main__.ClassA1[builtins.float, builtins.str]" |
| reveal_type(c) # N: Revealed type is "__main__.ClassA1[builtins.float, builtins.float]" |
| reveal_type(d) # N: Revealed type is "__main__.ClassA1[builtins.int, builtins.str]" |
| [builtins fixtures/tuple.pyi] |
| |
| [case testPEP695TypeParameterDefaultClass2] |
| # flags: --disallow-any-generics |
| |
| class ClassB1[**P2 = [int, str], **P3 = ...]: ... |
| |
| def func_b1( |
| a: ClassB1, |
| b: ClassB1[[float]], |
| c: ClassB1[[float], [float]], |
| d: ClassB1[[float], [float], [float]], # E: "ClassB1" expects between 0 and 2 type arguments, but 3 given |
| ) -> None: |
| reveal_type(a) # N: Revealed type is "__main__.ClassB1[[builtins.int, builtins.str], ...]" |
| reveal_type(b) # N: Revealed type is "__main__.ClassB1[[builtins.float], ...]" |
| reveal_type(c) # N: Revealed type is "__main__.ClassB1[[builtins.float], [builtins.float]]" |
| reveal_type(d) # N: Revealed type is "__main__.ClassB1[[builtins.int, builtins.str], ...]" |
| |
| k = ClassB1() |
| reveal_type(k) # N: Revealed type is "__main__.ClassB1[[builtins.int, builtins.str], [*Any, **Any]]" |
| l = ClassB1[[float]]() |
| reveal_type(l) # N: Revealed type is "__main__.ClassB1[[builtins.float], [*Any, **Any]]" |
| m = ClassB1[[float], [float]]() |
| reveal_type(m) # N: Revealed type is "__main__.ClassB1[[builtins.float], [builtins.float]]" |
| n = ClassB1[[float], [float], [float]]() # E: Type application has too many types (expected between 0 and 2) |
| reveal_type(n) # N: Revealed type is "Any" |
| |
| [case testPEP695TypeParameterDefaultClass3] |
| # flags: --disallow-any-generics |
| |
| class ClassC1[*Ts = *tuple[int, str]]: ... |
| |
| def func_c1( |
| a: ClassC1, |
| b: ClassC1[float], |
| ) -> None: |
| # reveal_type(a) # Revealed type is "__main__.ClassC1[builtins.int, builtins.str]" # TODO |
| reveal_type(b) # N: Revealed type is "__main__.ClassC1[builtins.float]" |
| |
| k = ClassC1() |
| reveal_type(k) # N: Revealed type is "__main__.ClassC1[builtins.int, builtins.str]" |
| l = ClassC1[float]() |
| reveal_type(l) # N: Revealed type is "__main__.ClassC1[builtins.float]" |
| [builtins fixtures/tuple.pyi] |
| |
| [case testPEP695TypeParameterDefaultTypeAlias1] |
| # flags: --disallow-any-generics |
| |
| type TA1[T2 = int, T3 = str] = dict[T2, T3] |
| |
| def func_a1( |
| a: TA1, |
| b: TA1[float], |
| c: TA1[float, float], |
| d: TA1[float, float, float], # E: Bad number of arguments for type alias, expected between 0 and 2, given 3 |
| ) -> None: |
| reveal_type(a) # N: Revealed type is "builtins.dict[builtins.int, builtins.str]" |
| reveal_type(b) # N: Revealed type is "builtins.dict[builtins.float, builtins.str]" |
| reveal_type(c) # N: Revealed type is "builtins.dict[builtins.float, builtins.float]" |
| reveal_type(d) # N: Revealed type is "builtins.dict[builtins.int, builtins.str]" |
| [builtins fixtures/tuple.pyi] |
| [typing fixtures/typing-full.pyi] |
| |
| [case testPEP695TypeParameterDefaultTypeAlias2] |
| # flags: --disallow-any-generics |
| |
| class ClassB1[**P2, **P3]: ... |
| type TB1[**P2 = [int, str], **P3 = ...] = ClassB1[P2, P3] |
| |
| def func_b1( |
| a: TB1, |
| b: TB1[[float]], |
| c: TB1[[float], [float]], |
| d: TB1[[float], [float], [float]], # E: Bad number of arguments for type alias, expected between 0 and 2, given 3 |
| ) -> None: |
| reveal_type(a) # N: Revealed type is "__main__.ClassB1[[builtins.int, builtins.str], [*Any, **Any]]" |
| reveal_type(b) # N: Revealed type is "__main__.ClassB1[[builtins.float], [*Any, **Any]]" |
| reveal_type(c) # N: Revealed type is "__main__.ClassB1[[builtins.float], [builtins.float]]" |
| reveal_type(d) # N: Revealed type is "__main__.ClassB1[[builtins.int, builtins.str], [*Any, **Any]]" |
| [builtins fixtures/tuple.pyi] |
| [typing fixtures/typing-full.pyi] |
| |
| [case testPEP695TypeParameterDefaultTypeAlias3] |
| # flags: --disallow-any-generics |
| |
| type TC1[*Ts = *tuple[int, str]] = tuple[*Ts] |
| |
| def func_c1( |
| a: TC1, |
| b: TC1[float], |
| ) -> None: |
| # reveal_type(a) # Revealed type is "Tuple[builtins.int, builtins.str]" # TODO |
| reveal_type(b) # N: Revealed type is "Tuple[builtins.float]" |
| |
| [builtins fixtures/tuple.pyi] |
| [typing fixtures/typing-full.pyi] |