You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Incompatible definition of generic field on multiple base classes #9031
[BUG] Edited for a clearer example
Given this code:
# mypy version 0.770
from typing import Generic, TypeVar
T = TypeVar("T", int, str)
class A:
foo: int
class B(Generic[T]):
foo: T
class C(B[int], A):
pass
reveal_type(A().foo)
reveal_type(B().foo)
reveal_type(C().foo)
I get this output:
example.py:11: error: Definition of "foo" in base class "B" is incompatible with definition in base class "A"
example.py:14: note: Revealed type is 'builtins.int'
example.py:15: note: Revealed type is 'builtins.int*'
example.py:16: note: Revealed type is 'builtins.int*'
I couldn't find what builtins.int*. The code makes sense though, right?
I think I just encountered a modified version of this in django-stubs: typeddjango/django-stubs#1227 . Due to the structure of the classes we are trying to type, the attribute is defined as generic in both base classes, and passed as a type parameter to each:
I just ran into the same issue. I don't see it explicitly mentioned above, but one workaround is to explicitly type the attribute in the concrete class (if that's an option; i.e. if the type is resolved in the class definition rather than the variable declaration); e.g.
fromtypingimportGeneric, TypeVarT=TypeVar('T')
classA(Generic[T]):
value: TclassB(Generic[T]):
value: TclassC(A[int], B[int]):
value: int
Activity
ilevkivskyi commentedon Jul 3, 2020
Yeah, this is a mypy bug. Likely related to #7724
headtr1ck commentedon Jun 17, 2022
Still happening with mypy 0.960 :(
Although, now without "*" in the revealed types.
adamchainz commentedon Nov 11, 2022
I think I just encountered a modified version of this in django-stubs: typeddjango/django-stubs#1227 . Due to the structure of the classes we are trying to type, the attribute is defined as generic in both base classes, and passed as a type parameter to each:
tonysyu commentedon Dec 20, 2022
I just ran into the same issue. I don't see it explicitly mentioned above, but one workaround is to explicitly type the attribute in the concrete class (if that's an option; i.e. if the type is resolved in the class definition rather than the variable declaration); e.g.
Fix attribute type resolution with multiple inheritance (python#18415)
Upgrade mypy to 1.15
Upgrade mypy to 1.15
Upgrade mypy to 1.15
More precisely type `pipe` methods (#10038)