web-dev-qa-db-fra.com

TypeError: super () prend au moins 1 argument (0 donné) l'erreur est spécifique à toute version de python?

Je reçois cette erreur

TypeError: super () prend au moins 1 argument (0 donné)

en utilisant ce code sur python2.7.11:

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

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

Bar()

La solution pour que cela fonctionne est la suivante:

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

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

Bar()

Il semble que la syntaxe soit spécifique à python 3. Alors, quel est le meilleur moyen de fournir un code compatible entre les versions 2.x et 3.x et d'éviter cette erreur?

47
BPL

Oui, la syntaxe à 0 argument est spécifique à Python 3, voir Nouveautés de Python 3.0 et PEP 3135 - New Super .

Dans Python 2 et le code qui doit être compatible avec toutes les versions, tenez-vous-en à laisser explicitement l'objet et l'occurrence de la classe.

Oui, il existe des "backports" qui font que la version sans argument de super() fonctionne dans Python 2 (comme dans la bibliothèque future), mais ils nécessitent un certain nombre de piratages incluant a analyse complète de la hiérarchie des classes pour trouver un objet de fonction correspondant. Ceci est à la fois fragile et lent, et ne vaut tout simplement pas la "commodité".

44
Martijn Pieters

C'est à cause de la version de python. Vérifiez votre version python avec la version [python --version] 2.7

In 2.7 use this [ super(baseclass, self).__init__() ]

class Bird(object):
    def __init__(self):
        print("Bird")

    def whatIsThis(self):
        print("This is bird which can not swim")

class Animal(Bird):
    def __init__(self):
        super(Bird,self).__init__()
        print("Animal")

    def whatIsThis(self):
        print("THis is animal which can swim")

a1 = Animal()
a1.whatIsThis()

> In 3.0 or more use this [ super().__init__()]

class Bird(object):
    def __init__(self):
        print("Bird")

    def whatIsThis(self):
        print("This is bird which can not swim")

class Animal(Bird):
    def __init__(self):
        super().__init__()
        print("Animal")

    def whatIsThis(self):
        print("THis is animal which can swim")

a1 = Animal()
a1.whatIsThis()
6
Viraj.Hadoop

Vous pouvez utiliser la bibliothèque future pour avoir une compatibilité Python2/Python3.

La fonction super est back-portée.

3
Laurent LAPORTE

Votre valeur par défaut python --version est probablement python2. Pour utiliser cette syntaxe, vous devez passer à python3. Pour ce faire, collez la commande suivante dans votre terminal.

Sudo update-alternatives --config python

Si vous obtenez l'erreur "pas d'alternative pour python", configurez vous-même une alternative avec la commande suivante:

Sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 10

puis vérifiez votre version python avec

python --version

si vous obtenez une version 3. +, votre problème est résolu.

0
Manzur Alahi