metaclass/__init_subclass__ keyword checking
Nessuno ha ancora preso questa issue.
- Lingua principale
- Python
- Stelle
- 20.6k
- Fork
- 3.3k
- Metriche di merge delle PR
- Metriche PR in attesa
Descrizione
Feature
A way for plugins to mark a metaclass as safely passing keyword arguments to __init_subclass__.
Pitch
The current situation
Currently, if a class is inherited from that both has a custom metaclass and __init_subclass__ defined then there is no type checking done for the keyword arguments in __init_subclass__. For example the following is an error:
class Base:
def __init_subclass__(cls, keyword: int = 0): ...
class Derived(Base, keyword='fail'): ...
error: Argument "keyword" to "__init_subclass__" of "Base" has incompatible type "str"; expected "int"
But this is not:
class Meta(type): ...
class Base(metaclass=Meta):
def __init_subclass__(cls, keyword: int = 0): ...
class Derived(Base, keyword='fail'): ...
The specifics around this are in #7723.
My issue
I have a base class that operates similar to dataclass object. I have a plugin that provides the semantics to mypy already. However, this class uses a metaclass and __init_subclass__ and I would like type checking on the __init_subclass__ keyword arguments. The metaclass __new__ does not do anything with the keyword arguments but pass them along, so I know it's safe to do the type checking. I would like for my plugin to be able to tell mypy that this metaclass is safe.
Unfortunately I can't just get rid of the metaclass as it provides a class level __await__.
My current solution is just to hack the TypeInfo._fullname for the metaclass to be builtins.type.
The solutions that come to mind would be either:
- A boolean on
TypeInfothat says that the metaclass is__init_subclass__safe (plugins just need to flip this in one of the existing hooks) - A way for plugins to manipulate the set of safe metaclasses that
Checkeruses (hook to customizeCheckerprior to run?)
I'm happy to do the work if a solution can be found.
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Inizia leggendo la logica di Checker che determina quali metaclassi sono sicure, quindi esamina TypeInfo e gli hook dei plugin esistenti menzionati nell’issue. Confronta il flag TypeInfo proposto con un hook per personalizzare l’insieme delle metaclassi sicure. Il lavoro è completato quando un plugin può contrassegnare una metaclasse come in grado di inoltrare in modo sicuro le parole chiave di init_subclass e l’esempio riceve il controllo dei tipi.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- python
- Ambito
- compilers, devtools
- Tipo di issue
- Funzionalità
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 30/100