Почему bool является подклассом int?

При хранении bool в memcached через python-memcached я заметил, что он возвращался как целое число. Проверка кода библиотеки показала мне, что есть место, где isinstance(val, int) проверяется, чтобы пометить значение как целое число.

Итак, я протестировал его в оболочке python и заметил следующее:

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

Но почему именно bool подкласс int?

Это имеет смысл, потому что логическое значение в основном представляет собой int, который может принимать только два значения, но для этого требуется намного меньше операций/пробелов, чем фактическое целое число (без арифметики, только один бит пространства для хранения)....

Ответ 1

Из комментария http://www.peterbe.com/plog/bool-is-int

Это совершенно логично, если вы были рядом, когда тип bool был добавлен в python (иногда около 2.2 или 2.3).

До введения фактического типа bool 0 и 1 были официальное представление ценности истины, похожее на C89. Избегать излишне нарушая неидеальный, но рабочий код, новый тип bool необходимо работать так же, как 0 и 1. Это выходит за рамки просто значения истины, но все интегральные операции. Никто не рекомендовал бы использовать логическое приводят к числовому контексту, и большинство людей не рекомендует тестирование равенство для определения ценности истины, никто не хотел насколько он существующий код. Таким образом, решение сделать True и False masquerade как 1 и 0 соответственно. Это просто исторический артефакт лингвистической эволюции.

Кредит идет на dman13 за это приятное объяснение.

Ответ 2

См. PEP 285 - Добавление типа bool. Соответствующий отрывок:

6) Должен ли bool наследовать от int?

= > Да.

В идеальном мире bool может быть лучше реализован как    отдельный целочисленный тип, который знает, как выполнять смешанный режим    арифметика. Однако наследование bool от    (отчасти со всех кодов C, вызывающих    PyInt_Check() будет продолжать работать - это возвращает true для    подклассы int).

Ответ 3

Также можно использовать help для проверки значения Bool в консоли:

помощь (True)

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
 |  

помощь (False)

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