Improve error message for return in metaclass __new__()
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Python
- Estrellas
- 77.2k
- Forks
- 35.9k
- Métricas de merge de PR
- Métricas de PR pendientes
Descripción
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
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Comienza reproduciendo los dos casos de metaclass new descritos en el issue y sigue el punto de entrada en tiempo de ejecución que genera el TypeError actual. Actualiza los diagnósticos para una devolución ausente o que no sea una clase, añade después cobertura para ambos ejemplos y verifica que los mensajes expliquen claramente el valor de retorno requerido.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- python
- Área
- compilers
- Tipo de issue
- Nueva funcionalidad
- Dificultad
- 3/5
- Tiempo estimado
- 1-2 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 35/100