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 x
Indicando 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.
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íneadef __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
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 tipobool
en Python. Antesbool
solo usa los enteros0
y1
.– Sven Marnach
22 de noviembre de 2011 a las 23:02
-
Sven Marnach
Porque el método especial correspondiente se llama __nonzero__()
en Python 2, y no __bool__()
hasta Pitón 3.