2016-09-04 36 views
2
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" 

Насколько я вижу, в обоих случаях super._new__ получает литерал класса в качестве первого аргумента и пустой кортеж как 2-й.Получите ошибку «super(): no arguments» в одном случае, но не аналогичный случай

Так почему же кто-то дает ошибку, а другой нет?

+1

Вы не используете 'cls' из' __new__' в своей 'DoNotWork' ... (также - вы действительно должны использовать' * args' в 'super()', а также для правильной подписи подписей ... –

+0

Im явно не дает '__new__' в' DoesNotWork' конкретный 1-й аргумент, но передаются аргументы 'super()', поэтому я не понимаю ошибку. Использование * args дает мне 'TypeError: type() принимает 1 или 3 аргумента, хотя это отдельный вопрос. – Luken

+0

Есть ли какая-то особая причина, по которой вы используете '__new__', а не' __init__' - похоже, что вы действительно пытаетесь использовать более позднюю версию ... –

ответ

6

Форма с нулевым аргументом super требует, чтобы метод, содержащий его, имел явный (то есть не varargs) первый аргумент. Об этом свидетельствуют an older version of the docs (курсив):

The zero argument form automatically searches the stack frame for the class (__class__) and the first argument.

По какой-то причине эта нота была удалена в более поздних версиях документации. (Может быть, стоит поднимая DOC ошибка, потому что документы весьма смутное представление о том, как нулевой аргумент super работает и то, что требуется для его работы.)

Смотрите также this Python bug report (который является нерешенным, и не ясно приняты как даже ошибка). Результатом является то, что нулевой аргумент super является магическим, и в некоторых случаях магия терпит неудачу. Как указано в отчете об ошибке, если вы хотите принять только varargs, вам нужно будет использовать явную форму с двумя аргументами super.

 Смежные вопросы

  • Нет связанных вопросов^_^