python / python/mypy

Mypy doesn't detect new metaclass on subclass

Aperta
#17,657 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

bug
Lingua principale
Python
Stelle
20.6k
Fork
3.3k
Metriche di merge delle PR
Metriche PR in attesa

Descrizione

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

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Direzione di ricerca

Inizia eseguendo l'esempio Python fornito con mypy 1.11.1 e confermando il falso errore di argomento mancante. Poi traccia come mypy determina la firma chiamabile per FingerprintSource quando la sua sottoclasse dichiara EnumMeta; aggiungi una copertura mirata per questo caso e verifica che l'esempio superi il controllo dei tipi senza l'errore.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
python
Ambito
compilers
Tipo di issue
Bug
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
35/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.