diff --git a/mypy/checker.py b/mypy/checker.py index 59de599006a8..9f41e2021853 100644 --- a/mypy/checker.py +++ b/mypy/checker.py @@ -682,6 +682,8 @@ def extract_callable_type(self, inner_type: Type | None, ctx: Context) -> Callab inner_type = get_proper_type(inner_type) outer_type: CallableType | None = None if inner_type is not None and not isinstance(inner_type, AnyType): + if isinstance(inner_type, TypeVarLikeType): + inner_type = inner_type.upper_bound if isinstance(inner_type, TypeType): if isinstance(inner_type.item, Instance): inner_type = expand_type_by_instance( diff --git a/test-data/unit/check-functools.test b/test-data/unit/check-functools.test index 710d3e66dfad..2b67f35c2179 100644 --- a/test-data/unit/check-functools.test +++ b/test-data/unit/check-functools.test @@ -541,3 +541,14 @@ p(1, "no") # E: Argument 2 to "A" has incompatible type "str"; expected "int" q: partial[A] = partial(A, 1) # OK [builtins fixtures/tuple.pyi] + +[case testFunctoolsPartialTypeVarBound] +from typing import Callable, TypeVar +import functools + +T = TypeVar("T", bound=Callable[[str, int], str]) + +def foo(f: T) -> T: + g = functools.partial(f, "foo") + return f +[builtins fixtures/tuple.pyi]