85 votes

Définir la "boolness" d'une classe en python

Pourquoi cela ne fonctionne-t-il pas comme on l'aurait naïvement espéré ?

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'

(Le résultat est x )

83voto

Paul McGuire Points 24790

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

Foo.__nonzero__ = Foo.__bool__

ou d'élargir la définition originale de Foo pour y inclure :

__nonzero__ = __bool__

Vous pouvez bien sûr les définir à l'inverse, où le nom de la méthode est __nonzero__ et vous l'affectez à __bool__ mais je pense que le nom __nonzero__ est juste un héritage du C-ishness original de l'interprétation de Python des objets comme vrais ou faux sur la base de leur équivalence avec zéro. Ajoutez simplement la déclaration ci-dessus et votre code fonctionnera avec Python 2.x, et fonctionnera automatiquement lorsque vous passerez à Python 3.x (et éventuellement vous pourrez abandonner l'assignation à __nonzero__ ).

0 votes

Où iraient ces insertions ? Je suppose que la première pourrait être placée immédiatement après la ligne return self.bar > 10 (en retrait de 0 espace) et que la seconde pourrait se situer immédiatement avant la ligne def __init__(self): (en retrait de 4 espaces). Est-ce correct ? Ou bien le deuxième devrait-il être après les __bool__ définition ?

75voto

Cat Plus Plus Points 53385

En __bool__ est utilisée dans Python 3. Pour Python 2, il faut __nonzero__ .

1 votes

C'est vrai, c'est étrange mais c'est vrai. Il est bon de voir qu'ils ont changé la mise en œuvre pour la "façon la plus évidente de le faire".

7 votes

@wim : Pas trop étrange. Les __nonzero__() est bien antérieure à l'introduction du type bool en Python. Avant bool les nombres entiers sont utilisés 0 y 1 .

3 votes

@SvenMarnach : Vous aviez 0 y 1 ? Dilbert ;-)

26voto

Sven Marnach Points 133943

Parce que la méthode spéciale correspondante s'appelle __nonzero__() dans Python 2, et non __bool__() jusqu'à Python 3.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X