python / python/mypy

Mypy doesn't detect new metaclass on subclass

Offen
#17,657 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

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

Beschreibung

Bug Report

If you subclass a class with a metaclass but change the metaclass to your own with a different method signature, mypy does not pick up on that.

To Reproduce

Example:

from enum import EnumType, StrEnum as _StrEnum, auto

class EnumMeta(EnumType):
  def __call__(cls, value=None, **kwargs):
    # Return first enum if value is None
    if value is None:
      value = next(iter(cls))
    return super().__call__(value, **kwargs)


class StrEnum(_StrEnum, metaclass=EnumMeta):
  @staticmethod
  def _generate_next_value_(name, *args):
    # auto() defaults to name.lower()
    return name


class FingerprintSource(StrEnum):
  can = auto()
  fw = auto()
  fixed = auto()


FingerprintSource()

Out: <FingerprintSource.can: 'can'>

Expected Behavior

Mypy passes

Actual Behavior

selfdrive/car/data_structures.py:310: error: Missing positional argument "value" in call to "FingerprintSource"  [call-arg]

Your Environment

mypy 1.11.1 (compiled: yes)
Python 3.11.4

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, das bereitgestellte Python-Beispiel mit mypy 1.11.1 auszuführen und den fälschlicherweise gemeldeten Fehler wegen eines fehlenden Arguments zu bestätigen. Verfolge anschließend, wie mypy die aufrufbare Signatur für FingerprintSource bestimmt, wenn dessen Unterklasse EnumMeta deklariert; füge eine gezielte Abdeckung für diesen Fall hinzu und verifiziere, dass die Typprüfung des Beispiels ohne den Fehler erfolgreich ist.

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
Größtenteils klar
Anfängerfreundlichkeit
35/100

Neue Issues direkt in Ihr Postfach

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