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
)
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__
).
Les __bool__
La méthode est utilisée dans Python 3. Pour Python 2, vous voulez __nonzero__
.
Parce que la méthode spéciale correspondante est appelée __nonzero__()
In Python 2, et non __bool__()
jusqu'à = Python 3.