Generic method in generic class impacting type signature of unrelated method
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 20.6k
- Forks
- 3.3k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
Bug Report
MyPy's type resolution appears to get impacted by an unrelated generic method when evaluating a method.
To Reproduce
"""Mypy bug: method-level type parameter breaks unrelated method's self type.
mypy --strict mypy-bug-repro.py
mypy 1.19.1, Python 3.13.9
"""
from typing import Protocol, Self
class Read(Protocol):
def read(self: Self) -> None: ...
class Write(Protocol):
def write(self: Self) -> None: ...
class CopyFrom(Protocol):
def copy_from(self: CopyFrom, src: CopyFrom) -> None: ...
class ReadWrite(Read, Write, Protocol):
pass
class Store[B: Read | Write | CopyFrom]:
def read(self: Store[Read]) -> None: ...
def copy_from[T: CopyFrom](self: Store[T], src: Store[T]) -> None: ...
def test(store: Store[ReadWrite]) -> None:
store.read() # Error: Invalid self argument
Expected Behavior
Expected mypy to be happy
Actual Behavior
mypy --strict --warn-unreachable --extra-checks returns;
error: Invalid self argument "Store[ReadWrite]" to attribute function "read" with type "Callable[[Store[Read]], None]" [misc]
Removing Store.copy_from fixes this.
Replacing test def with def test(store: Store[Read]) -> None: fixes this
Replacing Store.copy_from with the following fixes it as well;
type T = CopyFrom
class Store[B: Read | Write | CopyFrom]:
def read(self: Store[Read]) -> None: ...
def copy_from(self: Store[T], src: Store[T]) -> None: ...
Your Environment
- Mypy version used:
mypy 1.19.1 (compiled: yes) - Mypy command-line flags:
--strict --warn-unreachable --extra-checks - Mypy configuration options from
mypy.ini(and other config files):
[tool.mypy]
plugins = ["pydantic.mypy"]
exclude = ["build-resources"]
- Python version used:
Python 3.13.9
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
Beginne damit, die bereitgestellte Store[ReadWrite]-Reproduktion mit mypy 1.19.1 und den aufgeführten Strictness-Flags auszuführen, und verfolge dann, wie die generische Methode Store.copy_from den self-Typ von Store.read beeinflusst. Fertig ist die Änderung, wenn die Reproduktion kein ungültiges self-Argument mehr meldet, während das generische Verhalten korrekt bleibt und eine Regressionstestabdeckung für diesen Fall vorhanden ist.
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
- Ruhig
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 48/100