*Memo:
- My post explains type alias (1).
- My post explains type alias (2).
- My post explains type alias (4).
- My post explains type alias (5).
<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
from collections.abc import Callable
# ↓↓↓↓ ↓↓↓↓ Multiple variadic parameters cannot be used.
type TA[*Ts1, *Ts2] = Callable[[tuple[*Ts1], *Ts2], None] # Error
# 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)
Top comments (0)