2009-05-15 6 views

Répondre

14

Essayez ceci:

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

Parfait, merci! –

+4

utiliser "est" pour comparer Aucune est meilleure (et plus rapide) – kcwu

+0

@kcwu merci pour la suggestion. Je savais qu'ils étaient différents, mais j'ai fait un benchmark et j'ai trouvé une grande différence de performance. – Unknown

2

non, parce que l'instance n'existe pas lorsque la définition de la fonction de la classe de temps

Vous devez réécrire comme suit

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

Ce chiffre est légèrement différent original: vous ne pouvez pas passer arg3 avec la valeur None si vous le voulez vraiment.

Autre solution:

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

Une autre façon de le faire serait:

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

Cette version plus courte semble meilleure, surtout quand il y a plus d'un argument optionnel.

Utiliser avec précaution. Voir les commentaires ci-dessous ...

+0

faites attention si blah = 0 – kcwu

+0

ou False ou un tableau vide ... bref: ne le faites pas –

+0

comme le soulignent d'autres commentateurs, ce n'est pas vraiment Pythonic, car il a des effets inattendus. –

5

Toutes les réponses suggérant None sont correctes; si vous voulez vous assurer que l'appelant peut passer aucun comme argument régulier, utilisez un sentinel spécial et test avec is:

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

Chaque appel à object() fait un objet unique, de sorte que is ne réussiront jamais entre elle et toute autre valeur. Les deux caractères de soulignement dans __default signifient "fortement privé", ce qui signifie que les appelants savent qu'ils ne devraient pas essayer de se tromper avec lui (et auraient besoin de beaucoup de travail pour le faire, imitant explicitement le nom mangling que fait le compilateur).

La raison pour laquelle vous ne pouvez pas utiliser le code que vous avez publié, btw, est que les valeurs par défaut évaluent quand l'instruction def évalue, pas plus tard au moment de l'appel; et au moment def évalue, il n'y a pas encore self à partir de laquelle prendre la variable d'instance.

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

Ceci fonctionne avec python 2.5 et transmet et gère les cas où bla est des chaînes vides, des listes, etc.

Questions connexes