Aparece el error “super (): no argumentos” en un caso pero no en un caso similar

class Works(type): def __new__(cls, *args, **kwargs): print([cls,args]) # outputs [, ()] return super().__new__(cls, args) class DoesNotWork(type): def __new__(*args, **kwargs): print([args[0],args[:0]]) # outputs [, ()] return super().__new__(args[0], args[:0]) Works() # is fine DoesNotWork() # gets "RuntimeError: super(): no arguments" 

Por lo que puedo ver, en ambos casos, super._new__ recibe el literal de la clase como primer argumento y una tupla vacía como el segundo.

Entonces, ¿por qué uno da un error y el otro no?

La forma de super argumento de cero requiere que el método que lo contiene tenga un primer argumento explícito (es decir, que no sea de varargs). Esto es sugerido por una versión anterior de los documentos (énfasis agregado):

La forma de argumento cero busca automáticamente el marco de stack para la clase ( __class__ ) y el primer argumento .

Por alguna razón, esta nota fue eliminada en versiones posteriores de los documentos. (Podría valer la pena plantear un error de documento, porque los documentos son bastante vagos acerca de cómo funciona el argumento de cero argumentos y lo que se requiere para que funcione).

Consulte también este informe de errores de Python (que no está resuelto y no se acepta claramente como un error). El resultado es que el argumento de cero argumentos es mágico, y que la magia falla en algunos casos. Como se sugiere en el informe de error, si desea aceptar solo varargs, necesitará usar la forma explícita de super -dos argumentos.