2016-08-15 2 views
16

Я получаю эту ошибкуTypeError: super() принимает не менее 1 аргумента (0 данных), которая является конкретной для любой версии python?

TypeError: super() takes at least 1 argument (0 given)

используя этот код на python2.7.11:

class Foo(object): 
    def __init__(self): 
     pass 

class Bar(Foo): 
    def __init__(self): 
     super().__init__() 

Bar() 

Обходной, чтобы заставить его работать будет:

class Foo(object): 
    def __init__(self): 
     pass 

class Bar(Foo): 
    def __init__(self): 
     super(Bar, self).__init__() 

Bar() 

кажется синтаксис специфичен для python 3. Итак, что лучше всего обеспечить совместимый код между 2.x и 3.x и избежать этой ошибки?

+1

Этот синтаксис для Python 3. –

+0

@ DanielRoseman Я вижу, спасибо. Чтобы сделать мой вопрос немного более полезным, я немного отредактировал некоторые дополнительные материалы. – BPL

+1

Синтаксис Python 2 по-прежнему действителен в Python 3 в этом случае; если вы хотите поддерживать обе версии, используйте это. Обратите внимание, однако, что существует множество других несовместимостей между версиями. –

ответ

22

Да, синтаксис 0 аргументов специфичен для Python 3, см. What's New in Python 3.0 и PEP 3135 -- New Super.

В Python 2 и код, который должен быть совместим с кросс-версией, просто используйте явно для передачи в объекте класса и экземпляре.

Да, есть «Backports» доступен, которые делают версию без аргументов в super() работы в Python 2 (вроде future библиотеки), но это требует много хаков, которые включают в себя full scan of the class hierarchy найти объект функции согласования. Это и хрупкое, и медленное, и просто не стоит «удобства».

3

Вы можете использовать библиотеку future, чтобы иметь совместимость с Python2/Python3.

Функция super с обратной связью.

+0

О, мальчик, но эта реализация. Проверка кадров стека и полный проход пространств имен MRO для поиска контекста? Я не могу рекомендовать это использовать. –

+7

Просто используйте 'super (ClassName, self)' и немного повторите. –

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