2010-05-14 17 views
12

He escrito una función de Python que toma un valor de tiempo de espera como parámetro. Normalmente, el usuario siempre usará el mismo valor de tiempo de espera, pero en ocasiones puede esperar un poco más. El valor de tiempo de espera se almacena como una variable de instancia de clase. Quiero usar la variable de instancia timeout de la clase como el parámetro predeterminado. Actualmente, yo estoy poniendo en práctica esta de la siguiente manera:Variable de instancia de Python como parámetro predeterminado

def _writeAndWait (self, string, timeout = -1): 
    if (timeout == -1): 
     timeout = self._timeout 

Me estaba preguntando, es la forma correcta de usar una variable de instancia como un parámetro por defecto? ¿O hay una mejor manera de evitar el cheque "si"?

Respuesta

12

La respuesta corta a tu pregunta es no, no se puede eliminar la sentencia if, porque Python examina la firma sólo una vez, por lo que el valor predeterminado se comparte en todas las llamadas. Consideremos, por ejemplo:

def addit(x, L=[]): 
    L.append(x) 
    return L 

Versus:

def addit(x,L=None): 
    if L is None: 
     L=[] 
    L.append(x) 
    return L 

Estas dos funciones, a pesar de que parecen idénticas, en realidad tienen un comportamiento completamente diferente; en el primero, el valor predeterminado de L se comparte entre las invocaciones para que addit(1) seguido de addit(2) devolverá, en el primer caso, dos objetos que en realidad apuntan al mismo objeto subyacente y que tienen un valor de [1,2], mientras que el segundo caso devolverá dos objetos separados, [1] y [2].

La única recomendación que tengo para usted, entonces, es usar un valor predeterminado de None simplemente porque esa es la convención estándar para parámetros que no se han especificado, pero para continuar usando una verificación if, porque se usa como valor predeterminado algunos objetos existentes tendrán un comportamiento sutilmente diferente (generalmente incorrecto).

14

Una forma común es utilizar None como el valor por defecto

def _writeAndWait (self, string, timeout=None): 
    if timeout is None: 
     timeout = self._timeout 
1

en Python> 2.5 se puede segura una línea mediante el uso de la ternary condition operator:

def _writeAndWait (self, string, timeout=None): 
    timeout = self._timeout if timeout is None else timeout 
Cuestiones relacionadas