'Mypy: cast tuple values

def my_function(key, parameters: tuple[int | str, ...] | tuple[MyClass, ...]) -> None
    if key == "id":
        parameters = tuple(map(int, parameters))  

The last line raises

Argument 1 to "map" has incompatible type "Type[int]"; expected "Callable[[Union[MyClass, int, str]], int]"mypy(error)

How do I make this work? How do I tell mypy that I know that my tuple is made of int and str but not MyClass?



Solution 1:[1]

Use typing.cast to assert that parameters has type tuple[int|str,...]:

parameters = tuple(map(int, typing.cast(tuple[int|str,...], parameters)))

You might also consider using typing.overload to separate the signature into two simpler signatures.

from typing import overload, Literal

@overload
def my_function(key, parameters: tuple[int|str, ...]) ->  None:
    ...

@overload
def my_function(key, parameters: tuple[MyClass,...]) -> None:
    ...


def my_function(key, parameters):
    if key == "id":
       parameters = tuple(map(int, parameters))

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 chepner