Simplified scenario (playground):
from typing import TypeVar, reveal_type
class A: ...
class B(A): ...
class C(A): ...
T = TypeVar('T', bound=A)
def fun(*args: T) -> tuple[T, ...]: return args
# one parameter
reveal_type(fun(A())) # Revealed type is "builtins.tuple[gargs.A, ...]"
reveal_type(fun(B())) # Revealed type is "builtins.tuple[gargs.B, ...]"
reveal_type(fun(C())) # Revealed type is "builtins.tuple[gargs.C, ...]"
# multiple parameters, same type
reveal_type(fun(A(), A())) # Revealed type is "builtins.tuple[gargs.A, ...]"
reveal_type(fun(B(), B())) # Revealed type is "builtins.tuple[gargs.B, ...]"
reveal_type(fun(C(), C())) # Revealed type is "builtins.tuple[gargs.C, ...]"
# multiple parameters, different types
reveal_type(fun(A(), B())) # Revealed type is "builtins.tuple[gargs.A, ...]"
reveal_type(fun(B(), C())) # Revealed type is "builtins.tuple[gargs.A, ...]"
reveal_type(fun(C(), A())) # Revealed type is "builtins.tuple[gargs.A, ...]"
is there a way to annotate fun
to teach mypy
that fun
should return tuple[A, B]
, tuple[B, C]
and tuple[C, A]
in the three latter cases?