python / python/mypy

`Self` not accepted when used with a `dataclass`

Offen
#18,920 4 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

bug topic-pep-695 topic-self-types topic-type-variables
Vorherrschende Sprache
Python
Sterne
20.6k
Forks
3.3k
PR-Merge-Kennzahlen
PR-Kennzahlen ausstehend

Beschreibung

Using Self with a dataclass raises a type-var error even though Self is an acceptable type.

Suspect it may be the same as #18812.

To Reproduce

from __future__ import annotations
from dataclasses import dataclass
from typing import Self

type HasParent[N] = N | Node[N | HasParent[N]]


class Node[P = None]:
    def parent(self) -> P: ...  # type: ignore

@dataclass
class C[P: Node | None = Node | None](Node[P]):
    item: D[Self]

class D[P: HasParent[C] = C](Node[P]):
    pass

Changing to Self to the explicit class type (item: D[C]) is accepted. Similarly using Self in a regular class (e.g. below with __init__) does not raise any errors.

class C[P: Node | None = Node | None](Node[P]):
    def __init__(self, item: D[Self]):
        self.item = item

Expected Behavior

No errors.

Actual Behavior

error: Type argument "C[P]" of "D" must be a subtype of "HasParent[C[Node[None] | None]]"  [type-var]
error: Type argument "Self" of "D" must be a subtype of "HasParent[C[Node[None] | None]]"  [type-var]

Environment

  • Mypy version used: 1.15.0
  • Python version used: 13.2

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne damit, die bereitgestellte Reproduktion mit mypy 1.15.0 auszuführen, und vergleiche dann den Dataclass-Fall mit der Variante der regulären Klasse und dem expliziten Typargument C. Verfolge die bestehende Behandlung von Self, Dataclass-Feldern und den Bounds generischer Type-Variablen; abgeschlossen ist die Aufgabe, wenn die Reproduktion keine Fehler meldet und einen Regressionstest enthält.

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

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.