NameError: el nombre 'self' no está definido

144

Por qué tal estructura

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

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

da un error NameError: name 'self' is not defined?

Chriss
fuente

Respuestas:

159

Los valores de argumento predeterminados se evalúan en la función define-time, pero selfes un argumento solo disponible en el momento de la llamada a la función. Por lo tanto, los argumentos en la lista de argumentos no pueden referirse entre sí.

Es un patrón común predeterminar un argumento Noney agregar una prueba para eso en el código:

def p(self, b=None):
    if b is None:
        b = self.a
    print b
intgr
fuente
44
Aunque creo que lo anterior no es muy bonito (vengo de ruby ​​donde las cosas funcionan bien), lo anterior realmente funciona como una solución. Todavía es incómodo que Python haya elegido no estar disponible en una lista de parámetros.
shevy
2
@shevy: "self" no tiene un significado especial en python, es solo el nombre elegido convencionalmente para el primer argumento. También puede reemplazar "self" por "me" o "x".
Max
¿No hay mejor manera de hacer esto? Si tenemos una función que toma una docena de argumentos predeterminados que deberían hacer referencia a self, ¿realmente necesitamos una docena de declaraciones if? Esto es terriblemente incómodo.
Richard J. Barbalace
16

Para los casos en los que también desea tener la opción de establecer 'b' en Ninguno:

def p(self, **kwargs):
    b = kwargs.get('b', self.a)
    print b
Andrés
fuente
6

Si ha llegado aquí a través de google, asegúrese de verificar que se haya dado a sí mismo como el primer parámetro para una función de clase. Especialmente si intenta hacer referencia a valores para ese objeto dentro de la función.

def foo():
    print(self.bar)

> NameError: el nombre 'self' no está definido

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