`ClassVar` cannot contain `Self` type in generic classes
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 20.6k
- Forks
- 3.3k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
This rule seems correct when Self appears in a covariant position, like
class MyGeneric[T]:
# ill-defined, what's the type of MySequence.example?
example: ClassVar[Self] # error: ClassVar cannot contain Self type in generic classes
However, if Self appears in a contravariant position, I do not see why this should be an error.
class MyGeneric[T]:
pre_method_hooks: ClassVar[list[ Callable[[Self], None] ]] = []
Full example: https://mypy-play.net/?mypy=master&python=3.12&gist=951d5b3a168378cd33d9fc4aebd4572e
from typing import Callable, ClassVar, Self, Any
from abc import abstractmethod
class Transform[X, Y]:
pre_transform_hooks: ClassVar[list[Callable[[Self], None]]] = [] # ❌️
def __init_subclass__(cls) -> None:
super().__init_subclass__()
original_transform = cls.transform
def wrapped_transform(self: Self, x: X, /, *args: Any, **kwargs: Any) -> Y:
for hook in cls.pre_transform_hooks:
hook(self)
return original_transform(self, x, *args, **kwargs)
cls.transform = wrapped_transform # type: ignore[method-assign]
@abstractmethod
def transform(self, x: X, /) -> Y: ...
class Demo(Transform[int, int]):
def transform(self, x: int, /) -> int: return 0
def hello_world(self) -> None:
print(f"Hello, world! from {self}")
pre_transform_hooks: ClassVar[list[Callable]] = [hello_world]
Demo().transform(0) # prints "Hello, world! from <__main__.Demo object at ...>"
main.py:5: error: ClassVar cannot contain Self type in generic classes [misc]
Found 1 error in 1 file (checked 1 source file)
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 die Diagnose anhand des verlinkten mypy-play-Beispiels oder des gezeigten main.py-Snippets und verfolge anschließend die ClassVar- und Self-Validierung, die das generische Klassenmitglied ablehnt. Vergleiche die kovarianten und kontravarianten Fälle und prüfe vorhandene Tests für diese Regel. Erledigt ist die Aufgabe, wenn der beabsichtigte kontravariante Fall konsistent behandelt wird, während der ungültige kovariante Fall weiterhin diagnostiziert wird.
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
- 45/100