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?

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

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

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)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.