"""Helpers for interacting with type var tuples.""" from __future__ import annotations from collections.abc import Sequence from mypy.types import ( AnyType, Instance, Type, TypeVarLikeType, TypeVarTupleType, UnpackType, split_with_prefix_and_suffix, ) def split_with_instance( typ: Instance, ) -> tuple[tuple[Type, ...], tuple[Type, ...], tuple[Type, ...]]: assert typ.type.type_var_tuple_prefix is not None assert typ.type.type_var_tuple_suffix is not None return split_with_prefix_and_suffix( typ.args, typ.type.type_var_tuple_prefix, typ.type.type_var_tuple_suffix ) def erased_vars(type_vars: Sequence[TypeVarLikeType], type_of_any: int) -> list[Type]: args: list[Type] = [] for tv in type_vars: # Valid erasure for *Ts is *tuple[Any, ...], not just Any. if isinstance(tv, TypeVarTupleType): args.append(UnpackType(tv.tuple_fallback.copy_modified(args=[AnyType(type_of_any)]))) else: args.append(AnyType(type_of_any)) return args