¿Por qué bool es una subclase de int?


84

Al almacenar un bool en memcached a través de python-memcached, noté que se devuelve como un número entero. Verificar el código de la biblioteca me mostró que hay un lugar donde isinstance(val, int)se marca para marcar el valor como un número entero.

Así que lo probé en el shell de Python y noté lo siguiente:

>>> isinstance(True, int)
True
>>> issubclass(bool, int)
True

Pero, ¿por qué es exactamente booluna subclase de int?

Tiene sentido porque un booleano básicamente es un int que solo puede tomar dos valores, pero necesita muchas menos operaciones / espacio que un entero real (sin aritmética, solo un bit de espacio de almacenamiento) ...



1
Vale la pena señalar que, dado que en Python, todo es un objeto, con la sobrecarga que emplea, no tiene sentido tratar de ahorrar espacio haciendo que bools sea más pequeño. Si le importara el uso de la memoria, para empezar estaría usando un idioma diferente.
poco todo el

Respuestas:


101

De un comentario en http://www.peterbe.com/plog/bool-is-int

Es perfectamente lógico, si estuviera presente cuando se agregó el tipo bool a Python (en algún momento alrededor de 2.2 o 2.3).

Antes de la introducción de un tipo bool real, 0 y 1 eran la representación oficial del valor de verdad, similar a C89. Para evitar romper innecesariamente el código que no es ideal pero que funciona, el nuevo tipo bool necesitaba funcionar como 0 y 1. Esto va más allá del valor de verdad, sino de todas las operaciones integrales. Nadie recomendaría el uso de un resultado booleano en un contexto numérico, ni la mayoría de la gente recomendaría probar la igualdad para determinar el valor de verdad, nadie quería averiguar de la manera difícil cuánto código existente es de esa manera. Por lo tanto, la decisión de hacer Verdadero y Falso se disfraza de 1 y 0, respectivamente. Esto es simplemente un artefacto histórico de la evolución lingüística.

El crédito es para dman13 por esta bonita explicación.


2
Tenga en cuenta que esto podría ser históricamente cierto, pero idiomáticamente se ve mucho sum([f(value) for value in values])dónde f(x)hay algún tipo de función de filtro y necesita ver cuántos valores pasan el filtro.
Adam Smith

2
Personalmente, preferiría escribir sum(1 for value in values if f(value)), pero en realidad he visto a gente respetada abogar por las operaciones numéricas en bools.
Marius Gedminas

28

Consulte PEP 285 - Adición de un tipo bool . Pasaje relevante:

6) ¿Bool debe heredar de int?

=> Sí.

En un mundo ideal, bool podría implementarse mejor como un tipo de entero separado que sepa cómo realizar aritmética de modo mixto. Sin embargo, heredar bool de int facilita enormemente la implementación (en parte porque todo el código C que llama a PyInt_Check () seguirá funcionando; esto devuelve verdadero para las subclases de int).


0

También se puede usar helppara verificar el Boolvalor de 'en la consola:

ayuda (verdadero)

help(True)
Help on bool object:
class bool(int)
 |  bool(x) -> bool
 |  
 |  Returns True when the argument x is true, False otherwise.
 |  The builtins True and False are the only two instances of the class bool.
 |  The class bool is a subclass of the class int, and cannot be subclassed.
 |  
 |  Method resolution order:
 |      bool
 |      int
 |      object
 |  

ayuda (falso)

help(False)
Help on bool object:
class bool(int)
 |  bool(x) -> bool
 |  
 |  Returns True when the argument x is true, False otherwise.
 |  The builtins True and False are the only two instances of the class bool.
 |  The class bool is a subclass of the class int, and cannot be subclassed.
 |  
 |  Method resolution order:
 |      bool
 |      int
 |      object
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.