2009-11-26 32 views

Respuesta

116

Los valores de los argumentos predeterminados se evalúan en la función define-time, pero self es un argumento solo disponible en el tiempo 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 por defecto un argumento para None y añadir una prueba de que en el código:

def p(self, b=None): 
    if b is None: 
     b = self.a 
    print b 
+0

Aunque creo que lo anterior no es muy bonito (vengo de Ruby, donde las cosas funcionan bien), lo anterior en realidad funciona como una solución. Todavía es incómodo que Python eligió no estar disponible en una lista de parámetros. – shevy

14

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

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

No estoy seguro de qué es demasiado complicado al respecto. Siéntase libre de entrar con su propia solución que conserva todos los valores de b. – Andrew

1

Si ha llegado aquí a través de google, asegúrese de comprobar que se ha dado uno mismo como el primer parámetro de 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: nombre de 'yo' no está definido

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

> "Felicidades Usted se ha librado de la NameError!"

Cuestiones relacionadas