2009-05-15 8 views

Respuesta

14

Prueba esto:

def foo(self, blah=None): 
    if blah is None: # faster than blah == None - thanks to kcwu 
     blah = self.instance_var 
+0

Perfecto, gracias! –

+4

use "is" para comparar None es mejor (y más rápido) – kcwu

+0

@kcwu gracias por la sugerencia. Sabía que eran diferentes, pero hice un punto de referencia y encontré una gran diferencia de rendimiento. – Unknown

2

no, porque la instancia no existe cuando la función de la clase de tiempo definición

Usted tiene que volver a escribir la siguiente

def function(self, arg1=val1, arg2=val2, arg3=None): 
    if arg3 is None: 
     arg3 = self.instance_var 

Esto es un poco diferente a uno original: no puede pasar arg3 con valor None si realmente lo desea.

solución alternativa:

def function(self, arg1=val1, arg2=val2, **argd): 
    arg3 = argd.get('arg3', self.instance_var) 
-1

Una forma alternativa de hacer esto sería:

def foo(self, blah=None): 
    blah = blah or self.instance_var 

Esta versión más corta se ve mejor, especialmente cuando hay más de un argumento opcional.

Usar con cuidado. Consulte los comentarios a continuación ...

+0

tenga cuidado si blah == 0 – kcwu

+0

o falso o una matriz vacía ... breve: no lo haga –

+0

como señalan otros comentaristas, esto no es realmente pitónico, ya que tiene efectos inesperados. –

5

Todas las respuestas que sugieren None son correctas; si usted quiere asegurarse de que la persona que llama puede pasar Nada como un argumento regular, utilizar un especial sentinel y probar con is:

class Foo(object): 
    __default = object() 
    def foo(self, blah=Foo.__default): 
    if blah is Foo.__default: blah = self.instavar 

Cada llamada a object() hace un objeto único, de manera que is no tendrá éxito entre éste y cualquier otro valor Los dos caracteres de subrayado en __default significan "fuertemente privados", lo que significa que las personas que llaman saben que no deberían tratar de meterse con él (y necesitarían bastante trabajo para hacerlo, imitando explícitamente el nombre de manipulación que está haciendo el compilador).

La razón por la que no puede usar el código que publicó, por cierto, es que los valores predeterminados se evalúan cuando se evalúa la declaración def, no más tarde en la hora de la llamada; y en el momento en que def evalúa, todavía no hay self del cual tomar la variable de instancia.

0
def foo(self, blah=None): 
    blah = blah if not blah is None else self.instance_var 

Esto funciona con Python 2.5 y hacia delante y se ocupa de los casos en los que es bla cadenas vacías, listas y así sucesivamente.

Cuestiones relacionadas