¿Por qué no puedo extender bool en Python?

>>> class BOOL(bool): ... print "why?" ... why? Traceback (most recent call last): File "", line 1, in  TypeError: Error when calling the metaclass bases type 'bool' is not an acceptable base type 

Pensé que Python confiaba en el progtwigdor.

Guido lo toma:

Pensé en esto anoche, ¡y me di cuenta de que no se te debería permitir subclasificar en absoluto! Una subclase solo sería útil cuando tenga instancias, pero la mera existencia de una instancia de una subclase de bool rompería el invariante de que ¡Verdadero y Falso son las únicas instancias de bool! (Una instancia de una subclase de C es también una instancia de C.) Creo que es importante no proporcionar una puerta trasera para crear instancias bool adicionales, por lo que creo que bool no debería ser subclasificable.

Referencia: http://mail.python.org/pipermail/python-dev/2002-March/020822.html

Aquí hay una publicación que explica el razonamiento detrás de la decisión: http://mail.python.org/pipermail/python-dev/2004-February/042537.html

La idea es que bool tiene un propósito específico: ser True o False , y agregarlo solo serviría para complicar su código en otro lugar.

Dado que el OP menciona en un comentario:

Quiero 1 and 2 para devolver una instancia de mi clase.

Creo que es importante señalar que esto es completamente imposible: Python no te permite alterar los tipos incorporados (y, en particular, sus métodos especiales). El Literal 1 siempre será una instancia del tipo int integrado, y en cualquier caso, la semántica básica del operador and no se puede anular de todos modos: a and b siempre son idénticos a b if a else a para cualquier a y b (no bool coerción involucrada, aunque el OP parece creer erróneamente que uno está sucediendo).

Reafirmando este punto crucial: el valor de a and b es siempre, incambiablemente, b : no hay manera de romper esta restricción semántica (incluso si b fueran ejemplos de sus propias clases peculiares, menos aún por supuesto) cuando están limitados a ser instancias de int . incorporadas de Python -).

Si está utilizando Python 3 y desea tener una clase que se pueda evaluar como un valor booleano, pero que también contenga otra funcionalidad, implemente __bool__ en su clase.

En Python 2, se puede lograr el mismo efecto implementando __nonzero__ o __len__ (si su clase es un contenedor).

Porque se supone que bool solo tiene dos valores: True y False . Si pudieras subclasificar bool , podrías definir números arbitrarios de valores para eso, y eso definitivamente no es lo que quieres que suceda.

Una mejor pregunta es: ¿por qué quieres extender bool?