Incremental mode bug for nested ParamSpecs
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 20.6k
- Forks
- 3.3k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
Bug Report
This bug only occurs on the second run when using incremental mode. When using nested ParamSpecs, the outer ParamSpec (M below) is erroneously equal to the inner ParamSpec (P below).
Notably, pyright handles this correctly.
To Reproduce
from __future__ import annotations
from typing import Callable, Concatenate, Generic, ParamSpec, TypeVar
class ABase:
...
class ADerived(ABase):
def __init__(self, a_param_1: float) -> None:
super().__init__()
self.a_1 = a_param_1
M = ParamSpec("M")
P = ParamSpec("P")
R = TypeVar("R", bound=ABase)
class B(Generic[P, R]):
def __init__(
self,
a_class: Callable[P, R],
b_param_1: str,
*args: P.args,
**kwargs: P.kwargs,
) -> None:
self.a = a_class(*args, **kwargs)
self.b_1 = b_param_1
@classmethod
def build(
cls: Callable[Concatenate[Callable[P, R], M], B[P, R]],
a_class: Callable[P, R]
) -> Callable[M, B[P, R]]:
def new_constructor(
*args: M.args,
**kwargs: M.kwargs,
) -> B[P, R]:
return cls(a_class, *args, **kwargs)
return new_constructor
BADerived = B.build(ADerived)
reveal_type(BADerived) # note): Revealed type is "def (a_param_1: builtins.float) -> B[[a_param_1: builtins.float], ADerived]"
b_a_derived_1 = B(ADerived, "my_str", 1.0) # OK
b_a_derived_2 = BADerived( # [call-arg] error: Too many arguments
"my_str", 1.0 # [arg-type] error: Argument 1 has incompatible type "str"; expected "float"
)
Expected Behavior
I expect the signature of BADerived to include b_param_1, like this:
mypy_nested_paramspec.py:49: note: Revealed type is "def (b_param_1: builtins.str, a_param_1: builtins.float) -> mypy_nested_paramspec.B[[a_param_1: builtins.float], ADerived]"
I also expect that calls to BADerived with the correct parameter count and types do not raise any errors.
Actual Behavior
mypy_nested_paramspec.py:49: note: Revealed type is "def (a_param_1: builtins.float) -> mypy_nested_paramspec.B[[a_param_1: builtins.float], mypy_nested_paramspec.ADerived]"
mypy_nested_paramspec.py:52: error: Too many arguments [call-arg]
mypy_nested_paramspec.py:53: error: Argument 1 has incompatible type "str"; expected "float" [arg-type]
Your Environment
- Mypy version used: mypy 0.991 (compiled: yes)
- Python version used: 3.10.6
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Führe zunächst den bereitgestellten Reproduzierer für verschachtelte ParamSpecs zweimal mit aktiviertem inkrementellem Modus aus und untersuche anschließend den Pfad der Typprüfung für verschachtelte ParamSpecs. Als erledigt gilt die Aufgabe, wenn der zweite Lauf BADerived mit sowohl b_param_1 als auch a_param_1 in seiner Signatur ausgibt und den gezeigten korrekt typisierten Aufruf ohne Fehler akzeptiert.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- devtools
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 35/100