DEV Community

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

Posted on

Type alias in Python (2)

Buy Me a Coffee

*Memo:

Bound & Constraints:

''' Type statement ''' type TA1[T=float] = None type TA2[T:float=float] = None # Bound type TA3[T:(float, str)=float] = None # Constraints # type TA4[T:(float, str)=(float, str)] = None # Constraints # Error ''' Type statement ''' ''' TypeAliasType ''' # from typing import TypeVar, TypeAliasType  # T1 = TypeVar('T1', default=float) # T2 = TypeVar('T2', bound=float, default=float) # Bound # T3 = TypeVar('T3', (float, str), default=float) # Constraints # T4 = TypeVar('T4', (float, str), default=(float, str)) # Constraints # Error  # # Error for mypy # TA1 = TypeAliasType('TA1', value=T1 | None, type_params=(T1,)) # TA2 = TypeAliasType('TA2', value=T2 | None, type_params=(T2,)) # TA3 = TypeAliasType('TA3', value=T3 | None, type_params=(T3,)) ''' TypeAliasType ''' x1: TA1[object] = None # No error x2: TA1[complex] = None # No error x3: TA1[float] = None # No error # x3: TA1 = None # No error x4: TA1[int] = None # No error x5: TA1[bool] = None # No error x6: TA1[str] = None # No error  y1: TA2[object] = None # Error y2: TA2[complex] = None # Error y3: TA2[float] = None # No error # y3: TA2 = None # No error y4: TA2[int] = None # No error y5: TA2[bool] = None # No error y6: TA2[str] = None # Error  z1: TA3[object] = None # Error z2: TA3[complex] = None # Error z3: TA3[float] = None # No error # z3: TA3 = None # No error z4: TA3[int] = None # Error z5: TA3[bool] = None # Error z6: TA3[str] = None # No error 
Enter fullscreen mode Exit fullscreen mode
class A: ... class B(A): ... class C(B): ... class D(C): ... class E(D): ... ''' Type statement ''' type TA1[T=C] = None type TA2[T:C=C] = None # Bound type TA3[T:(C, str)=C] = None # Constraints # type TA4[T:(C, str)=(C, str)] = None # Constraints # Error ''' Type statement ''' ''' TypeAliasType ''' # from typing import TypeVar, TypeAliasType  # T1 = TypeVar('T1', default=C) # T2 = TypeVar('T2', bound=C, default=C) # Bound # T3 = TypeVar('T3', C, str, default=C) # Constraints # T4 = TypeVar('T4', C, str, default=(C, str)) # Constraints # Error  # # Error for mypy # TA1 = TypeAliasType('TA1', value=T1 | None, type_params=(T1,)) # TA2 = TypeAliasType('TA2', value=T2 | None, type_params=(T2,)) # TA3 = TypeAliasType('TA3', value=T3 | None, type_params=(T3,)) ''' TypeAliasType ''' x1: TA1[A] = None # No error x2: TA1[B] = None # No error x3: TA1[C] = None # No error # x3: TA1 = None # No error x4: TA1[D] = None # No error x5: TA1[E] = None # No error x6: TA1[str] = None # No error  y1: TA2[A] = None # Error y2: TA2[B] = None # Error y3: TA2[C] = None # No error # y3: TA2 = None # No error y4: TA2[D] = None # No error y5: TA2[E] = None # No error y6: TA2[str] = None # Error  z1: TA3[A] = None # Error z2: TA3[B] = None # Error z3: TA3[C] = None # No error # z3: TA3 = None # No error z4: TA3[D] = None # Error z5: TA3[E] = None # Error z6: TA3[str] = None # No error 
Enter fullscreen mode Exit fullscreen mode

Variance:

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

Top comments (0)