python / python/mypy

Allow a base class to restrict the type of subclass's inner class

Ouverte
#14,767 3 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

feature
Langage dominant
Python
Étoiles
20.6k
Forks
3.3k
Métriques de merge des PR
Métriques de PR en attente

Description

Feature

For regular classvars, attributes and methods, mypy already checks that the types in a subclass match those declared in the superclass. However, this checking does not extend to inner classes in the subclass. It seems inner classes are ignored by mypy entirely.

For example, a framework could define an abstract class Model whose inner class Meta must implement a certain protocol:

# Defined in the framework
class InnerMetaProtocol(Protocol):
    example_attr: str

class Model:
    Meta: type[InnerMetaProtocol]


# An application developer using framework
class Widget(Model):
    class Meta:
        example_attr = 123  # This should be an error: int is not str

Class Widget implements Model, whose attribute Meta should conform to type[InnerMetaProtocol], meaning it requires attribute example_attr: str. But currently mypy ignores this constraint: Playground.

It's probably useful to support this with not just protocols, but also concrete classes (e.g. Meta: type[ConcreteClass]).

Pitch

This pattern of inner Meta classes is used quite extensively in the Django ecosystem, including for Django models, forms, Django REST Framework serializers, djangorestframework-dataclasses, etc. I'm sure there are other use cases as well, but I don't know off the top of my head.

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par l’exemple Playground de l’issue et comparez le type déclaré de Model.Meta avec la classe interne Meta de la sous-classe. Le travail est terminé lorsque mypy signale l’exemple incompatible avec int et prend en charge les cas indiqués du protocole et de la classe concrète.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
python
Domaine
devtools
Type d'issue
Fonctionnalité
Difficulté
5/5
Temps estimé
Plus d'une semaine
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
35/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.