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

Я получаю эту ошибку

TypeError: super() принимает не менее 1 аргумент (задано 0)

используя этот код на 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

Да, синтаксис 0 аргументов специфичен для Python 3, см. Что нового в Python 3.0 и PEP 3135 - новый супер.

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

Да, есть доступные "backports", которые делают no-argument версию super() работы в Python 2 (например, библиотеке future), но для этого требуется несколько хаков, которые включают полное сканирование иерархии классов, чтобы найти соответствующий объект функции. Это и хрупкое, и медленное, и просто не стоит "удобства".

Ответ 2

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

Функция super перезагружена.