'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 |
