Bug Report
Mypy does not seem to recognize concretized type for a generic in its method's self.
To Reproduce
from typing import Callable, Generic, TypeVar from typing_extensions import ParamSpec, Concatenate, Self from unittest.mock import Mock P = ParamSpec("P") R = TypeVar("R") class Check(Generic[P, R]): def check(self) -> None: pass class Shall( Generic[P, R]): def __init__(self, callable: Callable[P, R]) -> None: pass def suchThat(self, other: Callable[Concatenate[R, P], bool]) -> Self: return self def check(returnValue: None, other: Check[[int],str] ) -> bool: return True Shall[[Check[[int],str]],None](Check[[int],str].check).suchThat(check)
https://mypy-play.net/?mypy=master&python=3.9&gist=0f2967cc8cff879cdfcc8280b7fca53c
Expected Behavior
No error
Actual Behavior
main.py:25: error: Argument 1 to "Shall" has incompatible type "Callable[[Check[P, R]], None]"; expected "Callable[[Check[[int], str]], None]" [arg-type]
[mypy] strict = True explicit_package_bases = True namespace_packages = True #mypy_path = src:test files = src,test mypy_path = $MYPY_CONFIG_FILE_DIR/src:$MYPY_CONFIG_FILE_DIR/test
Even smaller reproduction:
from typing import Callable, Generic, TypeVar from typing_extensions import ParamSpec, Concatenate, Self from unittest.mock import Mock P = ParamSpec("P") R = TypeVar("R") class Check(Generic[P, R]): def check(self) -> None: pass class Shall( Generic[P, R]): def __init__(self, callable: Callable[P, R]) -> None: pass Shall[[Check[[int],str]],None](Check[[int],str].check)
https://mypy-play.net/?mypy=master&python=3.9&gist=4ed820cd660f49a4f7f3d800054576aa
Use checkmember.py to check protocol subtyping (python#18943)
Activity
magwas commented on Mar 1, 2023
Even smaller reproduction:
from typing import Callable, Generic, TypeVar from typing_extensions import ParamSpec, Concatenate, Self from unittest.mock import Mock P = ParamSpec("P") R = TypeVar("R") class Check(Generic[P, R]): def check(self) -> None: pass class Shall( Generic[P, R]): def __init__(self, callable: Callable[P, R]) -> None: pass Shall[[Check[[int],str]],None](Check[[int],str].check)https://mypy-play.net/?mypy=master&python=3.9&gist=4ed820cd660f49a4f7f3d800054576aa
Use checkmember.py to check protocol subtyping (python#18943)
Use checkmember.py to check protocol subtyping (python#18943)