-
-
Notifications
You must be signed in to change notification settings - Fork 3k
Error inferring typevar on generic classes #18706
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
Does this cause any false positives or false negatives? Mypy should eventually bind |
The related problem was that T was not bound to the type in an instance object. The current problem is that T is not bound to the type in the class object. It could produce false negative if the class method is referenced. I know it is not common and a little bit strange. from typing import Iterator, Generic, TypeVar, Callable, Any
T = TypeVar("T", str, int)
class Parent(Generic[T]):
@classmethod
def method_1(cls, value: T) -> T:
return 2*value
def method_2(self, value: T) -> T:
return 2*value
class ChildInt(Parent[int]):
pass
instance = ChildInt()
reveal_type(ChildInt.method_1) # Revealed type is "def (value: builtins.int) -> builtins.int"
reveal_type(instance.method_1) # Revealed type is "def (value: builtins.int) -> builtins.int"
reveal_type(ChildInt.method_2) # Revealed type is "def (self: __main__.Parent[T`1], value: T`1) -> T`1"
reveal_type(instance.method_2) # Revealed type is "def (value: builtins.int) -> builtins.int"
def decorator[S](f: Callable[[S, int], int]) -> Callable[[S, int], int]:
return f
class GrandChildInt(ChildInt):
method_3 = decorator(ChildInt.method_2) # error: Argument 1 to "decorator" has incompatible type "Callable[[Parent[T], T], T]"; expected "Callable[[Parent[T], int], int]" [arg-type] https://mypy-play.net/?mypy=latest&python=3.12&gist=7ce2739ccc2b43f37187d54dcdd5f923 |
FYI: PyRigth reveal ChildInt.method_2 as |
This is another branch missing in |
|
That's what |
Fixes python#18024 Fixes python#18706 Fixes python#17734 Fixes python#15097 Fixes python#14814 Fixes python#14806 Fixes python#14259 Fixes python#13041 Fixes python#11993 Fixes python#9585 Fixes python#9266 Fixes python#9202 Fixes python#5481 This is a fourth "major" PR toward python#7724. This is one is watershed/crux of the whole series (but to set correct expectations, there are almost a dozen smaller follow-up/clean-up PRs in the pipeline). The core of the idea is to set current type-checker as part of the global state. There are however some details: * There are cases where we call `is_subtype()` before type-checking. For now, I fall back to old logic in this cases. In follow up PRs we may switch to using type-checker instances before type checking phase (this requires some care). * This increases typeops import cycle by a few modules, but unfortunately this is inevitable. * This PR increases potential for infinite recursion in protocols. To mitigate I add: one legitimate fix for `__call__`, and one temporary hack for `freshen_all_functions_type_vars` (to reduce performance impact). * Finally I change semantics for method access on class objects to match the one in old `find_member()`. Now we will expand type by instance, so we have something like this: ```python class B(Generic[T]): def foo(self, x: T) -> T: ... class C(B[str]): ... reveal_type(C.foo) # def (self: B[str], x: str) -> str ``` FWIW, I am not even 100% sure this is correct, it seems to me we _may_ keep the method generic. But in any case what we do currently is definitely wrong (we infer a _non-generic_ `def (x: T) -> T`). --------- Co-authored-by: hauntsaninja <[email protected]> Co-authored-by: Shantanu <[email protected]>
Bug Report
The inferred type of methods of a generic class are not bounded to typevar value on descendant classes.
To Reproduce
https://mypy-play.net/?mypy=latest&python=3.12&gist=7ce2739ccc2b43f37187d54dcdd5f923
Expected Behavior
This soulution could be acceptable, as well:
Actual Behavior
Your Environment
mypy.ini
(and other config files): no configReleated issues
#15658
The text was updated successfully, but these errors were encountered: