2010-05-14 10 views
12

Je suis en train d'écrire une fonction Python qui prend une valeur de délai d'attente en tant que paramètre. Normalement, l'utilisateur utilisera toujours la même valeur de délai d'attente, mais il peut parfois vouloir attendre un peu plus longtemps. La valeur du délai d'expiration est stockée en tant que variable d'instance de classe. Je veux utiliser la variable d'instance timeout de la classe comme paramètre par défaut. À l'heure actuelle, je suis comme suit l'exécution du présent:Variable d'instance Python en tant que paramètre par défaut

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

Je me demandais, est la bonne façon d'utiliser une variable d'instance comme paramètre par défaut? Ou y a-t-il une meilleure façon d'éviter le «si»?

Répondre

12

La réponse courte à votre question est non, vous ne pouvez pas éliminer l'instruction if, parce que Python examine une seule fois la signature, et donc le défaut est partagé entre tous les appels. Prenons, par exemple:

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 

Ces deux fonctions, mais ils semblent identiques, ont en fait un comportement complètement différent; dans la première, la valeur par défaut de L est partagée entre les invocations de sorte que addit(1) suivi de addit(2) retournera, dans le premier cas, deux objets qui pointent réellement vers le même objet sous-jacent et qui ont une valeur de [1,2], alors que le deuxième cas, il retournera deux objets distincts, [1] et [2]. La seule recommandation que j'ai pour vous, alors, est d'utiliser une valeur par défaut de None simplement parce que c'est la convention standard pour les paramètres qui n'ont pas été spécifiés, mais de continuer à utiliser une vérification if, car l'utilisation comme valeur par défaut un objet existant aura un comportement subtilement différent (généralement faux).

14

Une façon courante est d'utiliser None comme la valeur par défaut

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

En python> 2.5, vous pouvez en toute sécurité une ligne en utilisant le ternary condition operator:

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