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

je reçois cette erreur

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

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 de contournement pour le faire fonctionner serait:

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. Donc, quelle est la meilleure façon de fournir du code compatible entre 2.x et 3.x et éviter cette erreur?

31
demandé sur BPL 2016-08-16 00:03:06

2 réponses

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

dans Python 2 et le code qui doit être compatible avec les versions croisées, il suffit de passer dans l'objet class et l'instance explicitement.

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

34
répondu Martijn Pieters 2016-08-15 23:03:56

Vous pouvez utiliser le avenir bibliothèque pour avoir une compatibilité Python2/Python3.

super la fonction est rétroportée.

4
répondu Laurent LAPORTE 2016-08-15 21:35:46