2011-09-10 13 views
24
def save_file(self, outputfilename = self.image_filename): 
    self.file.read(outputfilename) 
    .... 

da NameError: name 'self' is not defined en la primera línea. Parece que Python no lo acepta. ¿Cómo puedo reescribir el código para que no genere una excepción?Usando uno mismo. * Como valor predeterminado para un método

+0

La definición de la función tiene lugar en un ámbito diferente y en un momento diferente. –

+0

Claro que estaría bien si funcionara. Hace que el código sea mucho más limpio. ¿Supongo que abriría alguna otra caja de Pandoran para implementar? –

Respuesta

25

Utilice un valor predeterminado de None y detecte eso.

def save_file(self, outputfilename=None): 
    if outputfilename is None: 
     outputfilename = self.image_filename 
    self.file.read(outputfilename) 
    .... 
+2

El problema con este patrón es engañoso. – Nikolai

3
def save_file(self, outputfilename = None): 
    if not outputfilename: 
     outputfilename = self.image_filename 
    self.file.read(outputfilename) 
    .... 
11

Los documentation estados: valores de los parámetros

predeterminados se evalúa cuando se ejecuta la definición de función.

Esto explica por qué no se puede hacer referencia a la instancia. Como han dicho otros, use None como su predeterminado y arregle el valor en el tiempo de ejecución de la función cuando la instancia esté disponible.

2
def save_file(self, outputfilename=None): 
    outputfilename = outputfilename or self.image_filename 
    self.file.read(outputfilename) 

o incluso

def save_file(self, outputfilename=None):   
    self.file.read(outputfilename or self.image_filename) 

Esto puede ser nada con una variable, pero si usted tiene, digamos, 5, esto hace que el código más fácil de leer, en mi opinión.

Cuestiones relacionadas