python / python/mypy

Inconsistent "Invalid Metaclass" error for classes defined within functions

Offen
#15,027 0 Kommentare 2 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

bug topic-metaclasses topic-type-alias
Vorherrschende Sprache
Python
Sterne
20.6k
Forks
3.3k
PR-Merge-Kennzahlen
PR-Kennzahlen ausstehend

Beschreibung

Bug Report

When a class:

  • is defined inside a function, and
  • uses a metaclass

then it mypy will inconsistently give an Invalid metaclass error based on whether the metaclass is specified via an alias name, or the original name from when the class is defined. This behaviour occurs regardless of whether the metaclass is defined inside or outside of the function. I would have expected no error.

To Reproduce

See on mypy playground

class M(type):
    pass


def f() -> None:
    _M = M

    class C(metaclass=_M): # Error
        pass
    
    class D(metaclass=M): # OK
        pass

Actual Behavior

main.py:8: error: Invalid metaclass "_M"  [misc]
Found 1 error in 1 file (checked 1 source file)

Your Environment

  • Mypy version used: 1.1.1
  • Python version used: 3.11

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 mit dem verknüpften mypy playground und der Reproduktion mit verschachtelter Funktion, wobei die aliased Metaklasse _M mit dem ursprünglichen Namen M verglichen wird. Verfolge die Prüfung auf eine ungültige Metaklasse und bestätige, dass äquivalente Aliase keine inkonsistenten Diagnosen mehr erzeugen, während das Beispiel keinen Fehler meldet.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
python
Bereich
compilers
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Klar beschrieben
Anfängerfreundlichkeit
45/100

Neue Issues direkt in Ihr Postfach

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