¿Por qué tal estructuraNameError: nombre de 'yo' no está definido
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
?
¿Por qué tal estructuraNameError: nombre de 'yo' no está definido
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
?
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
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
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
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!"
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