Incompatible return value type when using typevar with bound and self returning method
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 20.6k
- Forks
- 3.3k
- PR merge metrics
- PR metrics pending
Description
Bug Report
Using a typevar bound to a class that has a self returning method leads to an error when using in a function that operates on the typevar and returns the typevar.
Using constraint does not present the issue but looses the generic on the class.
To Reproduce
# pyright: strict
from typing import Any, Generic, TypeVar
from typing_extensions import Self, reveal_type
T = TypeVar("T")
class X(Generic[T]):
def m(self, v: int) -> Self:
return self
class Y:
def m(self, v: int) -> Self:
return self
# using bound: tb_self errors with Incompatible return value type
TB = TypeVar("TB", bound=X[Any] | Y)
def tb_self(value: TB) -> TB:
return value.m(42)
def tb(value: TB) -> TB:
return value
reveal_type(tb_self(X[int]()))
reveal_type(tb(X[int]()))
# using constraint: return type is X[Any] in both cases
TC = TypeVar("TC", X[Any], Y)
def tc_self(value: TC) -> TC:
return value.m(42)
def tc(value: TC) -> TC:
return value
reveal_type(tc_self(X[int]()))
reveal_type(tc(X[int]()))
https://gist.github.com/mypy-play/3f911f7de9e2282fb6463a7146ffae47
The output is:
file.py:20:12: error: Incompatible return value type (got "X[Any] | Y", expected "TB") [return-value]
file.py:25:13: note: Revealed type is "try_.X[builtins.int]"
file.py:26:13: note: Revealed type is "try_.X[builtins.int]"
file.py:37:13: note: Revealed type is "try_.X[Any]"
file.py:38:13: note: Revealed type is "try_.X[Any]"
Found 1 error in 1 file (checked 1 source file)
For reference pyright on the same input reports no error
Expected Behavior
The is no error.
Actual Behavior
Mypy reports an error when the using a self returning method
Your Environment
- Mypy version used: 1.9.0, 1.7.1
- Mypy command-line flags: none
- Mypy configuration options from
mypy.ini(and other config files): - - Python version used: 3.10, 3.12
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
Start by reproducing the provided example with mypy 1.9.0 and the stated Python versions, then compare the bound and constrained TypeVar cases and their revealed types. Done means the self-returning method produces no incompatible-return diagnostic while preserving the generic type shown in the expected reveal output.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- devtools
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 38/100