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 перезагружена.