More-helpful typing errors with Generics and Callables
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 20.6k
- Forks
- 3.3k
- PR merge metrics
- PR metrics pending
Description
Feature
Taking into consideration the following code (using mypy==1.4.1), the error messages are not very useful in debugging the problem. I have included the Pyright error message for comparison:
"""A test pipeline"""
from __future__ import annotations
from typing import Callable, Generic, TypeVar
from pydantic import BaseModel
from filter_base.filters.base_filter import BaseFilter
ModelT = TypeVar("ModelT", bound=BaseModel)
class TestFilter(BaseFilter, Generic[ModelT]):
"""A filter for loading a JSON file."""
def __init__(self, model_type: type[ModelT]):
"""Test filter."""
self.model_type: type[ModelT] = model_type
def output(self) -> ModelT:
"""Output the loaded model"""
return self.model_type()
def input(self, obj: ModelT) -> None:
"""Input the model"""
pass
T = TypeVar("T")
def connect(
connect_signal: Callable[[], T],
connect_slot: Callable[[T], None],
) -> None:
"""Connect a signal to a slot"""
# TODO: this is a bit silly - we're just immedicately calling the signal/slot
# however - it'll do for the purposes of type checking
connect_slot(connect_signal())
class SimpleModel(BaseModel):
"""A simple model"""
a: int
b: str
class SimpleModel2(BaseModel):
"""A simple model"""
c: int
d: str
def main() -> None:
a = TestFilter(SimpleModel)
b = TestFilter(SimpleModel2)
connect(a.output, b.input)
The diagnostics from mypy and Pyright are as follows (error is on the final line of code):
Diagnostics:
1. mypy: Cannot infer type argument 1 of "connect" [misc]
2. Pyright: Argument of type "(obj: SimpleModel2) -> None" cannot be assigned to parameter "connect_slot" of type "(T@connect) -> None" in function "connect"
Type "(obj: SimpleModel2) -> None" cannot be assigned to type "(SimpleModel) -> None"
Parameter 1: type "SimpleModel" cannot be assigned to type "SimpleModel2"
"SimpleModel" is incompatible with "SimpleModel2" [reportGeneralTypeIssues]
Pitch
Having the error messages of mypy more in-line with Pyright's reporting would mean that it is not essential to use Pyright's typechecking system when developing these sorts of generic systems.
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 supplied Python example with mypy 1.4.1 and compare its final diagnostic with the Pyright output shown in the issue. Done means mypy explains the incompatible Generic Callable argument with similarly actionable type details; the issue names no source files or tests to target.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- devtools
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 25/100