Definición de "boolness" de una clase en python
class boolean (3)
El método __bool__
se usa en Python 3. Para Python 2, quieres __nonzero__
.
¿Por qué no funciona esto como uno puede haber esperado ingenuamente?
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 salida es x
)
Para la compatibilidad de Python 2-3, simplemente agregue esto a su ejemplo:
Foo.__nonzero__ = Foo.__bool__
o expanda la definición original de Foo para incluir:
__nonzero__ = __bool__
Por supuesto, también podría definirlos en reversa, donde el nombre del método es __nonzero__
y lo asigna a __bool__
, pero creo que el nombre __nonzero__
es solo un legado de la C-ishness original de la interpretación de Python de los objetos como truthy o falsy basado en su equivalencia con cero. Simplemente agregue la declaración anterior y su código funcionará con Python 2.x, y funcionará automáticamente cuando actualice a Python 3.x (y eventualmente dejará la tarea en __nonzero__
).
Porque el método especial correspondiente se llama __nonzero__()
en Python 2, y no __bool__()
hasta Python 3.