web-dev-qa-db-fra.com

NameError: le nom 'self' n'est pas défini

Pourquoi une telle structure

class A:
    def __init__(self, a):
        self.a = a

    def p(self, b=self.a):
        print b

donne une erreur NameError: name 'self' is not defined?

131
chriss

Les valeurs d'argument par défaut sont évaluées à la fonction define-time, mais self est un argument uniquement disponible au moment de l'appel de la fonction. Ainsi, les arguments de la liste d’arguments ne peuvent pas se renvoyer.

Il est courant de passer par défaut un argument à None et d'ajouter un test pour cela dans le code:

def p(self, b=None):
    if b is None:
        b = self.a
    print b
139
intgr

Pour les cas où vous souhaitez également avoir la possibilité de définir "b" sur Aucune:

def p(self, **kwargs):
    b = kwargs.get('b', self.a)
    print b
16
Andrew

Si vous êtes arrivé ici via Google, assurez-vous de vérifier que vous vous êtes défini comme premier paramètre d'une fonction de classe. Surtout si vous essayez de référencer les valeurs de cet objet dans la fonction.

def foo():
    print(self.bar)

> NameError: le nom 'self' n'est pas défini

def foo(self):
    print(self.bar)

> "Félicitations, vous vous êtes débarrassé de NameError!"

6
Erich