77 votes

TypeError: super () prend au moins 1 argument (0 donné). L'erreur est-elle 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 du code compatible entre les versions 2.x et 3.x et d'éviter cette erreur?

70voto

Martijn Pieters Points 271458

Oui, le 0-argument de la syntaxe spécifique à Python 3, voir nouveautés de Python 3.0 et PEP 3135 -- Nouveau Super.

En Python 2 et le code qui doit être compatible version, il suffit de coller à passer dans la classe de l'objet et de l'instance de manière explicite.

Oui, il y a "backports" disponibles que faire d'un non-argument de la version de super() de travail en Python 2 (comme l' future bibliothèque), mais elles nécessitent un certain nombre de hacks qui incluent une analyse complète de la hiérarchie de classe pour trouver un correspondant de la fonction de l'objet. C'est à la fois fragile et lent, et tout simplement pas la peine de la "commodité".

25voto

Viraj.Hadoop Points 154

C'est à cause de la version de python. Vérifiez votre version de python avec [python --version], il pourrait s'agir de 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()
 

4voto

Laurent LAPORTE Points 10193

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

La super fonction est back-portée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X