type: ignore for “incompatible with supertype” error in subclass should suffice for subsubclasses too
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 20.6k
- Forks
- 3.3k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
class A:
def foo(self, s: str) -> str: ...
class B(A):
def foo(self, n: float) -> float: ... # type: ignore
class C(B):
def foo(self, n: float) -> float: ...
Mypy is correct to report an error for B.foo that necessitated a type: ignore comment. However, having added that type: ignore for B.foo, mypy should not also report an error for C.foo. Although C.foo is inconsistent with A.foo, it’s consistent with B.foo, and I have already asked mypy to ignore the inconsistency between B.foo and A.foo.
To put this another way, I recognize that mypy would fail to catch the runtime error in a: A = C(); a.foo("str"), but this would still be a runtime error if C.foo did not override B.foo, so the blame should be assigned solely to B.foo and not to C.foo.
This comes up in the typeshed stubs for markdown.inlinepatterns:
class Pattern:
def handleMatch(self, m: Match) -> Optional[Union[str, Element]]: ...
class InlineProcessor(Pattern):
def handleMatch(self, m: Match, data) -> Union[Tuple[Element, int, int], Tuple[None, None, None]]: ... # type: ignore
These stubs correctly reflect the upstream API which uses handleMatch with a different signature in subclasses of InlineProcessor than in other subclasses of Pattern. That wasn’t a great API design decision, but now that it’s made and the type: ignore was added to InlineProcessor.handleMatch, ideally I shouldn’t have to repeat the same type: ignore in order to write a custom subclass of InlineProcessor whose handleMatch satisfies the signature of InlineProcessor.handleMatch.
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
Reproduziere das Verhalten bei der Prüfung von Unterklassen im verknüpften mypy playground und vergleiche es anschließend mit den typeshed-Stubs unter stubs/Markdown/markdown/inlinepatterns.pyi sowie der Implementierung in upstream markdown/treeprocessors.py. Als erledigt gilt die Aufgabe, wenn ein type: ignore bei InlineProcessor.handleMatch auch einen unnötigen incompatible-with-supertype-Fehler für eine kompatible Überschreibung einer Unterklasse verhindert, während die ursprüngliche B.foo-Diagnose weiterhin unterdrückt wird.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- compilers, devtools
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 35/100