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.
Parfait, merci! –
utiliser "est" pour comparer Aucune est meilleure (et plus rapide) – kcwu
@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