Почему 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