¿Cómo puedo implementar la conversión a booleano para clases en 2.x? ¿Por qué no funciona el método mágico “__bool__”?

2 minutos de lectura

avatar de usuario de wim
ingenio

Probé este código en Python 2.7:

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'

se imprime xIndicando que foo se consideraba veraz. Parece que la lógica en __bool__ no tiene efecto. ¿Por qué no?


Para el independiente de la versión, “cómo hacerlo” versión de esta pregunta, consulte el valor booleano de los objetos en Python.

Avatar de usuario de PaulMcG
PabloMcG

Para compatibilidad con Python 2-3, agregue una línea después de la clase para crear un alias para el método:

Foo.__nonzero__ = Foo.__bool__

o incluir un alias dentro de la clase:

__nonzero__ = __bool__

Por supuesto, esto también funcionaría al revés, pero creo que el nombre __nonzero__ es solo un legado del C-ishness original de la interpretación de Python de los objetos como verdaderos o falsos en función de su equivalencia con cero. Simplemente agregue la declaración anterior y el código funcionará independientemente de la versión de Python (y el __nonzero__ la definición se puede descartar cuando ya no se necesita soporte para 2.x).

  • ¿Adónde irían estas inserciones? Supongo que el primero podría ir inmediatamente después de la línea. return self.bar > 10 (0 espacios con sangría) y que el segundo podría ir inmediatamente antes de la línea def __init__(self): (4 espacios con sangría). ¿Es eso correcto? O tendría que irse el segundo después la __bool__ ¿definición?

    – Escarabajo

    22 de septiembre de 2015 a las 11:24

Avatar de usuario de Cat Plus Plus
gato más más

Él __bool__ El método se usa solo en Python 3.x. Para 2.x, use __nonzero__.

  • cierto, extraño pero cierto. es bueno ver que cambiaron la implementación a la ‘una forma obvia de hacerlo’

    – Wim

    22 de noviembre de 2011 a las 6:18

  • @wim: No demasiado extraño. Él __nonzero__() el nombre del método es considerablemente anterior a la introducción del tipo bool en Python. Antes boolsolo usa los enteros 0 y 1.

    – Sven Marnach

    22 de noviembre de 2011 a las 23:02

  • @SvenMarnach: Ustedes tenían 0 y 1? dilberto 😉

    – JS.

    17 de octubre de 2014 a las 0:57


Avatar de usuario de Sven Marnach
Sven Marnach

Porque el método especial correspondiente se llama __nonzero__() en Python 2, y no __bool__() hasta Pitón 3.

¿Ha sido útil esta solución?