DEV Community

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

Posted on

Type alias in Python (3)

Buy Me a Coffee

*Memo:

<TypeVarTuple (base)>:

from collections.abc import Callable

''' Type statement '''
type TA1[*Ts=*tuple[int, ...]] = Callable[[tuple[*Ts], *Ts], None]
''' Type statement '''

''' TypeAliasType '''
# from typing import TypeAliasType, TypeVarTuple, Unpack

# Ts = TypeVarTuple('Ts', default=Unpack[tuple[int, ...]])

# TA1 = TypeAliasType('TA1',
#                     value=Callable[[tuple[Unpack[Ts]], Unpack[Ts]], None],
#                     type_params=(Ts,)) # Error for mypy
''' TypeAliasType '''

''' Assignment statement '''
# TA1[*Ts=*tuple[int, ...]] = Callable[[tuple[*Ts], *Ts], None] # Error
''' Assignment statement '''

''' TypeAlias '''
# from typing import TypeAlias, TypeVarTuple, Unpack

# Ts = TypeVarTuple('Ts', default=Unpack[tuple[int, ...]])

# TA1: TypeAlias = Callable[[tuple[Unpack[Ts]], Unpack[Ts]], None]
''' TypeAlias '''

lam = lambda x, *args: print(x, args)
    #     With no type arguments, the default type doesn't work for mypy,
    # ↓↓↓ which is a bug, then `Any` is set to the type parameters.
v1_1: TA1 = lam
# v1_1: TA1[] = lam # Error
                                              # If no bug # If a bug
v1_1((), *())                                 # No error  # No error
v1_1((0, 1, 2), *(0, 1, 2))                   # No error  # No error
v1_1(('A', 'B', 'C'), *('A', 'B', 'C'))       # Error     # No error
v1_1((None, None, None), *(None, None, None)) # Error     # No error
v1_1 = ()                                     # Error     # Error
v1_1 = (0, 1, 2)                              # Error     # Error
v1_1 = ('A', 'B', 'C')                        # Error     # Error
v1_1 = (None, None, None)                     # Error     # Error

v1_2: TA1[*tuple[int, ...]] = lam

v1_2((), *())                                 # No error 
v1_2((0, 1, 2), *(0, 1, 2))                   # No error
v1_2(('A', 'B', 'C'), *('A', 'B', 'C'))       # Error
v1_2((None, None, None), *(None, None, None)) # Error
v1_2 = ()                                     # Error
v1_2 = (0, 1, 2)                              # Error
v1_2 = ('A', 'B', 'C')                        # Error
v1_2 = (None, None, None)                     # Error

v1_3: TA1[*tuple[str, ...]] = lam 

v1_3((), *())                                 # No error
v1_3((0, 1, 2), *(0, 1, 2))                   # Error
v1_3(('A', 'B', 'C'), *('A', 'B', 'C'))       # No error
v1_3((None, None, None), *(None, None, None)) # Error
v1_3 = ()                                     # Error
v1_3 = (0, 1, 2)                              # Error
v1_3 = ('A', 'B', 'C')                        # Error
v1_3 = (None, None, None)                     # Error

v1_4: TA1[*tuple[None, ...]] = lam

v1_4((), *())                                 # No error
v1_4((0, 1, 2), *(0, 1, 2))                   # Error
v1_4(('A', 'B', 'C'), *('A', 'B', 'C'))       # Error
v1_4((None, None, None), *(None, None, None)) # No error
v1_4 = ()                                     # Error
v1_4 = (0, 1, 2)                              # Error
v1_4= ('A', 'B', 'C')                         # Error
v1_4 = (None, None, None)                     # Error

v1_5: TA1[*tuple[int|str|None, ...]] = lam

v1_5((), *())                                 # No error
v1_5((0, 1, 2), *(0, 1, 2))                   # No error
v1_5(('A', 'B', 'C'), *('A', 'B', 'C'))       # No error
v1_5((None, None, None), *(None, None, None)) # No error
v1_5 = ()                                     # Error
v1_5 = (0, 1, 2)                              # Error
v1_5 = ('A', 'B', 'C')                        # Error
v1_5 = (None, None, None)                     # Error

type TA2[*Ts=*tuple[int, ...]] = TA1[*Ts] | tuple[*Ts]
    #     With no type arguments, the default type doesn't work for mypy,
    # ↓↓↓ which is a bug, then `Any` is set to the type parameters.
v2_1: TA2 = lam
# v2_1: TA2[] = lam # Error
                                              # If no bug # If a bug
v2_1((), *())                                 # Error     # Error
v2_1((0, 1, 2), *(0, 1, 2))                   # Error     # Error
v2_1(('A', 'B', 'C'), *('A', 'B', 'C'))       # Error     # Error
v2_1((None, None, None), *(None, None, None)) # Error     # Error
v2_1 = ()                                     # No error  # No error
v2_1 = (0, 1, 2)                              # No error  # No error
v2_1 = ('A', 'B', 'C')                        # Error     # No error
v2_1 = (None, None, None)                     # Error     # No error

v2_2: TA2[*tuple[int, ...]] = lam

v2_2((), *())                                 # Error
v2_2((0, 1, 2), *(0, 1, 2))                   # Error
v2_2(('A', 'B', 'C'), *('A', 'B', 'C'))       # Error
v2_2((None, None, None), *(None, None, None)) # Error
v2_2 = ()                                     # No error
v2_2 = (0, 1, 2)                              # No error
v2_2 = ('A', 'B', 'C')                        # Error
v2_2 = (None, None, None)                     # Error

v2_3: TA2[*tuple[str, ...]] = lam 

v2_3((), *())                                 # Error
v2_3((0, 1, 2), *(0, 1, 2))                   # Error
v2_3(('A', 'B', 'C'), *('A', 'B', 'C'))       # Error
v2_3((None, None, None), *(None, None, None)) # Error
v2_3 = ()                                     # No error
v2_3 = (0, 1, 2)                              # Error
v2_3 = ('A', 'B', 'C')                        # No error
v2_3 = (None, None, None)                     # Error

v2_4: TA2[*tuple[None, ...]] = lam

v2_4((), *())                                 # Error
v2_4((0, 1, 2), *(0, 1, 2))                   # Error
v2_4(('A', 'B', 'C'), *('A', 'B', 'C'))       # Error
v2_4((None, None, None), *(None, None, None)) # Error
v2_4 = ()                                     # No error
v2_4 = (0, 1, 2)                              # Error
v2_4 = ('A', 'B', 'C')                        # Error
v2_4 = (None, None, None)                     # No error

v2_5: TA2[*tuple[int|str|None, ...]] = lam

v2_5((), *())                                 # Error
v2_5((0, 1, 2), *(0, 1, 2))                   # Error
v2_5(('A', 'B', 'C'), *('A', 'B', 'C'))       # Error
v2_5((None, None, None), *(None, None, None)) # Error
v2_5 = ()                                     # No error
v2_5 = (0, 1, 2)                              # No error
v2_5 = ('A', 'B', 'C')                        # No error
v2_5 = (None, None, None)                     # No error
Enter fullscreen mode Exit fullscreen mode
from collections.abc import Callable

      # ↓↓↓↓  ↓↓↓↓ Multiple variadic parameters cannot be used.
type TA[*Ts1, *Ts2] = Callable[[tuple[*Ts1], *Ts2], None] # Error
Enter fullscreen mode Exit fullscreen mode
# Run without `--strict`
# No type arguments make the type parameters without default types `Any`. 

from collections.abc import Callable
from typing import reveal_type

type TA[*Ts] = Callable[[tuple[*Ts], *Ts], None]

v: TA = lambda x, *args: print(x, args)

reveal_type(v)
# def (builtins.tuple[Any, ...], *Any)
Enter fullscreen mode Exit fullscreen mode

Top comments (0)