Allow unsafe overrides in sub-subclasses that are compatible with subclass
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 20.6k
- Forks
- 3.3k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
Feature
When a subclass is implemented with unsafe method override, error can be suppressed with # type: ignore[override] comment. However, further subclassing requires this comment to be present in subclasses too.
Pitch
Suppose we have the following structure:
class A:
def foo(self) -> int: pass
class B(A):
def foo(self) -> str: pass # type: ignore[override]
class C(B):
def foo(self) -> str: pass
Currently mypy complains:
example.py:8: error: Return type "str" of "foo" incompatible with return type "int" in supertype "A"
But in reality we do expect that all B subclasses should implement foo with signature () -> str. For instance, it is useful when B is replacement for A with slightly different usage (when we don't want to replicate all internal logic - e.g. if it comes from third-party package). It takes care to override all methods that became incompatible after this change, and now B is consistent. Then we want to add some feature to B via subclassing while preserving its interface. All signatures are preserved, but mypy complains that we are incompatible with old base (A). I think that when unsafe override is explicitly ignored once, mypy should check new implementation against definitions in B, not in A, ignoring the fact that B has unsafe overrides. Actually now the checker reports errors that are explicitly ignored: we already took care to ignore that errors inside B.
Real world example: ModelChoiceField in Django inherits from ChoiceField (yeah, that's bad design decision, but I'm working on stubs and can't change the source). Incompatible part:
class ChoiceField(Field):
def to_python(self, data: Optional[Any]) -> str: ...
class ModelChoiceField(ChoiceField):
def to_python(self, data: Optional[Any]) -> Optional[Model]: ... # type: ignore[override]
When end Django user tries to subclass ModelChoiceField and implements to_python with same signature, user receives mypy error. However, this implementation is perfectly valid as long as direct superclass already defines that incompatible change.
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
Das Issue nennt keine Quelldateien oder Tests. Beginne damit, das A/B/C-Beispiel zu reproduzieren, und verfolge mypy's Override-Prüfung für Methoden von Unterklassen; abgeschlossen ist es, wenn Cs kompatibles Override auf Grundlage von B akzeptiert wird, während Bs ausdrücklich ignorierte Inkompatibilität weiterhin unterdrückt bleibt.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- devtools
- Issue-Typ
- Feature
- Schwierigkeit
- 5/5
- Geschätzter Aufwand
- Über eine Woche
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 35/100