Improve error message for return in metaclass __new__()
Personne n'a encore pris cette issue.
- Langage dominant
- Python
- Étoiles
- 77.2k
- Forks
- 35.9k
- Métriques de merge des PR
- Métriques de PR en attente
Description
Feature or enhancement
Proposal:
Case1: When overriding new in a custom Meta class and forgetting to return a class object (e.g. by omitting return super().new(..)) Python raises the following error:
TypeError: 'NoneType' object is not callable
Case2: When returning something else other than class object it raises following error:
TypeError: 'str' object is not callable
This messages, while technically correct, lacks guidance for common scenarios and can confuse developers - especially those new to Meta class.
Steps to Reproduce:
Case1:
class NewMeta(type):
def new(cls, name, bases, dct):
print ("Forgot to return!")
class MyClass(metaclass = NewMeta):
def greet(self):
pass
m = MyClass()
Output: TypeError: 'NoneType' object is not callable
Case2:
class NewMeta(type):
def new(cls, name, bases, dct):
return ("Return non-callable object")
class MyClass(metaclass = NewMeta):
def greet(self):
pass
m = MyClass()
Output: TypeError: 'str' object is not callable
Suggested Improvement:
Improve the error message to something like:
TypeError: metaclass new must return a class object. Recommendation: super().new(metacls, name, bases, namespace)?
This small change could save significant debugging time and make advanced features like metaclasses more approachable.
Python Version:
Tested in Python 3.12.4 (tags/v3.12.4:8e8a4ba, Jun 6 2024, 19:30:16) [MSC v.1940 64 bit (AMD64)]
Why This Matters:
- Metaclass usage is already an advanced topic.
- Improving the DX (developer experience) here will help advanced learners and reduce friction.
- Similar improvements have already been adopted in recent Python versions for other common errors.
Has this already been discussed elsewhere?
This is a minor feature, which does not need previous discussion elsewhere
Links to previous discussion of this feature:
No response
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Commencez par reproduire les deux cas de metaclass new décrits dans l’issue et suivez le point d’entrée à l’exécution qui déclenche le TypeError actuel. Mettez à jour les diagnostics pour gérer une valeur de retour absente ou qui n’est pas une classe, puis ajoutez une couverture pour les deux exemples et vérifiez que les messages expliquent clairement la valeur de retour requise.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- python
- Domaine
- compilers
- Type d'issue
- Fonctionnalité
- Difficulté
- 3/5
- Temps estimé
- 1-2 jours
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 35/100