Skip to content

Instantly share code, notes, and snippets.

@mypy-play
Created January 14, 2026 13:00
Show Gist options
  • Select an option

  • Save mypy-play/5cbe8e8aaad06dce64c91ebbfa74697b to your computer and use it in GitHub Desktop.

Select an option

Save mypy-play/5cbe8e8aaad06dce64c91ebbfa74697b to your computer and use it in GitHub Desktop.
Shared via mypy Playground
from typing import Callable, Iterable, Protocol, Concatenate, overload
class Transformer[P, B]:
pass
@overload
def partial_transformer[T1, T2, T3, T4, **P, O](func: Callable[Concatenate[T1, T2, T3, T4, P], O]) -> Callable[P, Transformer[tuple[T1, T2, T3, T4], O]]:
pass
@overload
def partial_transformer[T1, T2, T3, **P, O](func: Callable[Concatenate[T1, T2, T3, P], O]) -> Callable[P, Transformer[tuple[T1, T2, T3], O]]:
pass
@overload
def partial_transformer[T1, T2, **P, O](func: Callable[Concatenate[T1, T2, P], O]) -> Callable[P, Transformer[tuple[T1, T2], O]]:
pass
@overload
def partial_transformer[T1, **P, O](func: Callable[Concatenate[T1, P], O]) -> Callable[P, Transformer[T1, O]]:
pass
def partial_transformer(func):
def _partial(*args, **kwargs): return Transformer()
return _partial
@partial_transformer
def test1(arg1: int, /, *, env: str = "dev") -> float:
return 0.1
@partial_transformer
def test2(arg1: int, arg2: int, /, *, env: str = "dev") -> float:
return 0.1
@partial_transformer
def test3(arg1: int, arg2: int, arg3: str, /, *, env: str = "dev", eps: float = 0.1) -> float:
return 0.1
@partial_transformer
def test4(arg1: int, arg2: int, arg3: str, arg4: list[float], *, env: str, eps: float) -> float:
return 0.1
# reveal_type(test1)
# reveal_type(test2)
# reveal_type(test3)
reveal_type(test4)
tr4 = test4(env='prod', eps=0.2)
reveal_type(tr4)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment