¿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) ...

ThiefMaster
fuente
11
Aquí está la opinión de Alex Martelli sobre una pregunta relacionada .
Sven Marnach
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.

Polinomio
fuente
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).

Steven Rumbalski
fuente
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
aeronave
fuente