2011-11-20 7 views
56

Por qué no este trabajo como uno podría haber esperado ingenuamente?Definiendo "boolness" de una clase en Python

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)

+0

El duplicado solamente se refiere al problema de Python 2. Mientras que éste da una solución portátil. –

Respuesta

60

Para compatibilidad Python 2-3, sólo tiene que añadir esto a su ejemplo:

Foo.__nonzero__ = Foo.__bool__ 

o ampliar la definición original de Foo incluir:

__nonzero__ = __bool__ 

Se podría, por supuesto, ellos definen a la inversa también, donde el nombre del método es __nonzero__ y lo ha asignado a __bool__, pero creo que el nombre __nonzero__ es sólo un legado del original C-ishness de la interpretación de Python de objetos como Truthy o Falsy basado en su equivalencia con z ero. Sólo tiene que añadir la declaración anterior y su código trabajará con Python 2.x, y trabajará de forma automática cuando se actualiza a Python 3.x (y, finalmente, una caída de la asignación a __nonzero__).

+3

me gusta esa palabra, C-ishness – wim

+2

Soy un neologiac. – PaulMcG

+0

y un bucle extraño. –

22

Debido a que el método especial correspondiente se llama __nonzero__() en Python 2, y no __bool__() hasta Python 3.

49

El método __bool__ se utiliza en Python 3. Para Python 2, quiere __nonzero__.

+0

correcto, extraño pero cierto. bueno ver que cambiaron la implementación a la 'forma obvia de hacerlo' – wim

+6

@wim: No es demasiado extraño. El nombre del método '__nonzero __()' es considerablemente anterior a la introducción del tipo 'bool' en Python. Antes de 'bool', simplemente usa los enteros' 0' y '1'. –

+1

Sí, fue una gran sorpresa leer eso. True y False son conceptualmente muy diferentes de los enteros 0 y 1, así que estoy muy contento de que se haya presentado bool. Todavía me resulta extraño que bool es una subclase de int, y me estremezco cuando veo a alguien índice de una matriz con un bool .. – wim

Cuestiones relacionadas