DEV Community

Super Kai (Kazuya Ito)
Super Kai (Kazuya Ito)

Posted on

Type alias in Python (6)

Buy Me a Coffee

*Memo:

Variance:

from collections.abc import Callable ''' Type statement ''' type TA1[**P] = Callable[[], Callable[P, None]] # Covariant type TA2[**P] = tuple[Callable[P, None], ...] # Covariant type TA3[**P] = Callable[P, None] # Covariant type TA4[**P] = Callable[P, Callable[P, None]] # Covariant type TA5[**P] = list[Callable[P, None]] # Invariant ''' Type statement ''' ''' TypeAliasType ''' # from typing import ParamSpec, TypeAliasType  # P = ParamSpec('P')  # # Error for mypy # TA1 = TypeAliasType('TA1', value=Callable[[], Callable[P, None]], # type_params=(P,)) # Covariant # TA2 = TypeAliasType('TA2', value=tuple[Callable[P, None], ...], # type_params=(P,)) # Covariant # TA3 = TypeAliasType('TA3', value=Callable[P, None], # type_params=(P,)) # Contravariant # TA4 = TypeAliasType('TA4', value=Callable[P, Callable[P, None]], # type_params=(P,)) # Invariant # TA5 = TypeAliasType('TA5', value=list[Callable[P, None]], # type_params=(P,)) # Invariant ''' TypeAliasType ''' lam = lambda x, y: None v1: TA1[float, float] = lambda: lam # Covariant a1: TA1[object, object] = v1 # Error b1: TA1[complex, complex] = v1 # Error c1: TA1[float, float] = v1 # No error d1: TA1[int, int] = v1 # No error e1: TA1[bool, bool] = v1 # No error  v2: TA2[float, float] = (lam, lam) # Covariant a2: TA2[object, object] = v2 # Error b2: TA2[complex, complex] = v2 # Error c2: TA2[float, float] = v2 # No error d2: TA2[int, int] = v2 # No error e2: TA2[bool, bool] = v2 # No error  v3: TA3[float, float] = lambda x, y: None # Covariant a3: TA3[object, object] = v3 # Error b3: TA3[complex, complex] = v3 # Error c3: TA3[float, float] = v3 # No error d3: TA3[int, int] = v3 # No error e3: TA3[bool, bool] = v3 # No error  v4: TA4[float, float] = lambda x, y: lam # Covariant a4: TA4[object, object] = v4 # Error b4: TA4[complex, complex] = v4 # Error c4: TA4[float, float] = v4 # No error d4: TA4[int, int] = v4 # No error e4: TA4[bool, bool] = v4 # No error  v5: TA5[float, float] = [lam, lam] # Invariant a5: TA5[object, object] = v5 # Error b5: TA5[complex, complex] = v5 # Error c5: TA5[float, float] = v5 # No error d5: TA5[int, int] = v5 # Error e5: TA5[bool, bool] = v5 # Error 
Enter fullscreen mode Exit fullscreen mode
from collections.abc import Callable ''' Type statement ''' type TA1[**P] = Callable[[], Callable[P, None]] # Covariant type TA2[**P] = tuple[Callable[P, None], ...] # Covariant type TA3[**P] = Callable[P, None] # Covariant type TA4[**P] = Callable[P, Callable[P, None]] # Covariant type TA5[**P] = list[Callable[P, None]] # Invariant ''' Type statement ''' ''' TypeAliasType ''' # from typing import ParamSpec, TypeAliasType  # P = ParamSpec('P')  # # Error for mypy # TA1 = TypeAliasType('TA1', value=Callable[[], Callable[P, None]], # type_params=(P,)) # Covariant # TA2 = TypeAliasType('TA2', value=tuple[Callable[P, None], ...], # type_params=(P,)) # Covariant # TA3 = TypeAliasType('TA3', value=Callable[P, None], # type_params=(P,)) # Contravariant # TA4 = TypeAliasType('TA4', value=Callable[P, Callable[P, None]], # type_params=(P,)) # Invariant # TA5 = TypeAliasType('TA5', value=list[Callable[P, None]], # type_params=(P,)) # Invariant ''' TypeAliasType ''' class A: ... class B(A): ... class C(B): ... class D(C): ... class E(D): ... lam = lambda x, y: None v1: TA1[C, C] = lambda: lam # Covariant a1: TA1[A, A] = v1 # Error b1: TA1[B, B] = v1 # Error c1: TA1[C, C] = v1 # No error d1: TA1[D, D] = v1 # No error e1: TA1[E, E] = v1 # No error  v2: TA2[C, C] = (lam, lam) # Covariant a2: TA2[A, A] = v2 # Error b2: TA2[B, B] = v2 # Error c2: TA2[C, C] = v2 # No error d2: TA2[D, D] = v2 # No error e2: TA2[E, E] = v2 # No error  v3: TA3[C, C] = lambda x, y: None # Covariant a3: TA3[A, A] = v3 # Error b3: TA3[B, B] = v3 # Error c3: TA3[C, C] = v3 # No error d3: TA3[D, D] = v3 # No error e3: TA3[E, E] = v3 # No error  v4: TA4[C, C] = lambda x, y: lam # Covariant a4: TA4[A, A] = v4 # Error b4: TA4[B, B] = v4 # Error c4: TA4[C, C] = v4 # No error d4: TA4[D, D] = v4 # No error e4: TA4[E, E] = v4 # No error  v5: TA5[C, C] = [lam, lam] # Invariant a5: TA5[A, A] = v5 # Error b5: TA5[B, B] = v5 # Error c5: TA5[C, C] = v5 # No error d5: TA5[D, D] = v5 # Error e5: TA5[E, E] = v5 # Error 
Enter fullscreen mode Exit fullscreen mode

<TypeVar, TypeVarTuple & ParamSpec base>:

from collections.abc import Callable ''' Type statement ''' type TA[**P, *Ts, T] = Callable[P, Callable[[*Ts, T], None]] ''' Type statement ''' ''' TypeAliasType ''' # from typing import ParamSpec, TypeAliasType, TypeVar, TypeVarTuple, Unpack  # P = ParamSpec('P') # Ts = TypeVarTuple('Ts') # T = TypeVar('T')  # TA = TypeAliasType('TA', value=Callable[P, Callable[[Unpack[Ts], T], None]], # type_params=(P, Ts, T)) # Error for mypy ''' TypeAliasType ''' ''' Assignment statement ''' # TA[**P, *Ts, T] = Callable[P, Callable[[*Ts, T], None]] # Error ''' Assignment statement ''' ''' TypeAlias ''' # from typing import (ParamSpec, TypeAlias, TypeAliasType, # TypeVar, TypeVarTuple, Unpack) # P = ParamSpec('P') # Ts = TypeVarTuple('Ts') # T = TypeVar('T')  # TA: TypeAlias = Callable[P, Callable[[Unpack[Ts], T], None]] ''' TypeAlias ''' v: TA[[int, str], *tuple[int, str], int] = lambda w, x: lambda *y, z: None 
Enter fullscreen mode Exit fullscreen mode

Top comments (0)