在一个案例中得到"super():no arguments"错误但不是类似案例

Luk*_*ken 9 python super

class Works(type):
    def __new__(cls, *args, **kwargs):
        print([cls,args]) # outputs [<class '__main__.Works'>, ()]
        return super().__new__(cls, args)

class DoesNotWork(type):
    def __new__(*args, **kwargs):
        print([args[0],args[:0]]) # outputs [<class '__main__.doesNotWork'>, ()]
        return super().__new__(args[0], args[:0])

Works() # is fine
DoesNotWork() # gets "RuntimeError: super(): no arguments"
Run Code Online (Sandbox Code Playgroud)

据我所知,在两种情况下,super._new__都接收类文字作为第一个参数,一个空元组作为第二个参数.

那么为什么会出错而另一个不出错?

Bre*_*arn 16

零参数形式super要求包含它的方法具有显式(即非varargs)第一个参数.这是由较旧版本的文档(强调添加)建议的:

零参数表单自动在堆栈帧中搜索class(__class__)和第一个参数.

出于某种原因,在以后的文档版本中删除了此注释.(可能值得提出一个doc bug,因为文档对零参数如何super工作以及它工作所需的内容非常模糊.)

另请参阅此Python错误报告(未解决,即使是错误也未明确接受).结果是零参数super是魔术,并且在某些情况下魔法失败.正如错误报告中所建议的那样,如果你只想接受varargs,你需要使用显式的双参数形式super.

  • 感谢您提供答案,Python 有时是如此未完成。 (2认同)