Generic class with constrained type vars
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 20.6k
- Forks
- 3.3k
- PR merge metrics
- PR metrics pending
Description
On Python 3.7.0 and mypy 0.620, I'm getting some error messages I don't understand. The Mypy documentation and PEP 484 didn't clear it up for me. Maybe it's a bug in Mypy. Maybe I don't understand type erasure. In case it's the former, here's a minimal example. In case it's the latter, please help.
In the following examples, the fact that m does not return is not critical. In the real code that gave me these errors, m is an abstract method, which also doesn't change anything important.
Put the following examples in mypy-test.py to get the corresponding output from running mypyt mypy-test.py. The first and the last examples are the ones that are baffling me.
classmethod with constrained type variable
from typing import TypeVar, Generic
T = TypeVar('T', int, str)
class K(Generic[T]):
@classmethod
def m(cls) -> T:
raise NotImplementedError
Mypy output:
mypy-test.py:5: error: The erased type of self 'def [T in (builtins.int, builtins.str)] () -> mypy-test.K[builtins.int*]' is not a supertype of its class 'Type[mypy-test.K[T`1]]'
mypy-test.py:5: error: The erased type of self 'def [T in (builtins.int, builtins.str)] () -> mypy-test.K[builtins.str*]' is not a supertype of its class 'Type[mypy-test.K[T`1]]'
classmethod with generic self
from typing import TypeVar, Generic
S = TypeVar('S')
T = TypeVar('T', int, str)
class K(Generic[T]):
@classmethod
def m(cls: S) -> T:
raise NotImplementedError
produces no error.
classmethod with unconstrained type variable
from typing import TypeVar, Generic
T = TypeVar('T')
class K(Generic[T]):
@classmethod
def m(cls) -> T:
raise NotImplementedError
produces no error.
instance method with constrained type
from typing import TypeVar, Generic
T = TypeVar('T', int, str)
class K(Generic[T]):
def __init__(self, t: T) -> None:
self.t = t
produces
mypy-test.py:5: error: Need type annotation for 't'
instance method with unconstrained type
from typing import TypeVar, Generic
T = TypeVar('T')
class K(Generic[T]):
def __init__(self, t: T) -> None:
self.t = t
produces no error.
instance method with constrained type and inheritance
from typing import TypeVar, Generic
T = TypeVar('T', int, str)
class K(Generic[T]):
def __init__(self, t: T) -> None:
self.t: T = t
class L(K[T]):
def __init__(self, t: T) -> None:
self.u = 1
super().__init__(t=t)
produces
mypy-test.py:10: error: Argument "t" to "__init__" of "K" has incompatible type "int"; expected "T"
mypy-test.py:10: error: Argument "t" to "__init__" of "K" has incompatible type "str"; expected "T"
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Reproduce the examples in mypy-test.py with Python 3.7.0 and mypy 0.620, starting with the constrained and unconstrained generic class methods. Compare the diagnostics for class methods, instance attributes, and inherited constructors, then determine the intended behavior before deciding whether implementation changes or regression tests are needed.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- devtools
- Issue type
- Bug
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Stale
- Clarity
- Needs clarification
- Newbie friendliness
- 25/100