web-dev-qa-db-fra.com

Définir "Boolness" d'une classe in python

Pourquoi cela ne fonctionne-t-il pas pour que l'on puisse avoir naïvement attendu?

class Foo(object):
    def __init__(self):
        self.bar = 3
    def __bool__(self):
        return self.bar > 10

foo = Foo()

if foo:
    print 'x'
else:
    print 'y'

(La sortie est x)

66
wim

Pour Python 2-3 compatibilité, ajoutez simplement ceci à votre exemple:

Foo.__nonzero__ = Foo.__bool__

ou développez la définition initiale de FOO pour inclure:

__nonzero__ = __bool__

Vous pouvez bien sûr le définir en sens inverse aussi, où le nom de la méthode est __nonzero__ Et vous l'attribuez à __bool__, Mais je pense que le nom __nonzero__ Est juste un héritage du C-ishness original de l'interprétation de Python d'objets comme une vérité ou une fausseté basée sur leur équivalence avec zéro. Il suffit d'ajouter la déclaration ci-dessus et votre code fonctionnera avec Python 2.x et fonctionnera automatiquement lorsque vous effectuez une mise à niveau vers Python 3.x (et éventuellement, vous supprimez l'affectation à __nonzero__).

68
PaulMcG

Les __bool__ La méthode est utilisée dans Python 3. Pour Python 2, vous voulez __nonzero__.

57
Cat Plus Plus

Parce que la méthode spéciale correspondante est appelée __nonzero__() In Python 2, et non __bool__() jusqu'à = Python 3.

24
Sven Marnach