python / python/mypy

No-field class derived from `dataclass_transform` base class uses base class's constructor signature

Offen
#19,452 1 Kommentar 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

bug topic-dataclass-transform
Vorherrschende Sprache
Python
Sterne
20.6k
Forks
3.3k
PR-Merge-Kennzahlen
PR-Kennzahlen ausstehend

Beschreibung

Bug Report

When a class derives from a base class marked with dataclass_transform and the derived class has no fields, mypy incorrectly infers that the derived class does not provide its own constructor. This issue does not happen if the derived class has any fields.

Pyright infers the correct constructor signature here.

To Reproduce

from typing import dataclass_transform, reveal_type

@dataclass_transform()
class Base:
   def __init__( self, a: int ) -> None:
      pass

class DerivedNoFields( Base ):
   pass

class DerivedWithFields( Base ):
   b: str

reveal_type( DerivedNoFields.__init__ )
reveal_type( DerivedWithFields.__init__ )

Playground link

Expected Behavior

main.py:14: note: Revealed type is "def (self: __main__.DerivedNoFields)"
main.py:15: note: Revealed type is "def (self: __main__.DerivedWithFields, b: builtins.str)"

Actual Behavior

main.py:14: note: Revealed type is "def (self: __main__.Base, a: builtins.int)"
main.py:15: note: Revealed type is "def (self: __main__.DerivedWithFields, b: builtins.str)"

Your Environment

  • Mypy version used: 3.16.1
  • Python version used: 3.13
  • No command-line flags or configuration options

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 main.py-Reproduktion aus dem Issue oder dessen mypy-play-Link auszuführen, und vergleiche die beiden reveal_type-Ergebnisse. Verfolge den Einstiegspunkt für die Konstruktor-Synthese von dataclass_transform und die vorhandenen Tests. Füge anschließend Abdeckung für die abgeleitete Klasse ohne Felder hinzu; fertig ist es, wenn DerivedNoFields.__init__ nur self enthält, während der Fall mit Feldern unverändert bleibt.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
python
Bereich
compilers
Issue-Typ
Bug
Schwierigkeit
3/5
Geschätzter Aufwand
1-2 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
48/100

Neue Issues direkt in Ihr Postfach

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