Почему bool является подклассом int?
при хранении bool в memcached через python-memcached я заметил, что он возвращается как целое число. Проверка кода библиотеки показала мне, что есть место где isinstance(val, int)
проверяется флаг значение как целое число.
поэтому я протестировал его в оболочке python и заметил следующее:
>>> isinstance(True, int)
True
>>> issubclass(bool, int)
True
но почему же bool
подкласс int
?
это имеет смысл, потому что булево в основном является int, который может просто взять два значения, но для этого требуется гораздо меньше операций/пространства, чем фактическое целое число (без арифметики, только один бит пространства для хранения)....
3 ответа:
из комментария к http://www.peterbe.com/plog/bool-is-int
Это совершенно логично, если вы были вокруг, когда тип bool был добавлено в python (где-то около 2.2 или 2.3).
до введения фактического типа bool, 0 и 1 были официальное представление истинностной ценности, аналогично C89. Избегать излишне нарушая неидеальный, но рабочий код, новый тип bool нужно работать так же, как 0 и 1. Это идет за пределами только истинной ценности, но все интегральные операции. Никто не рекомендовал бы использовать логическое значение результат в числовом контексте, и большинство людей не рекомендуют тестирование равенство для того чтобы определить значение правды, никто не хотел узнать трудное способ, насколько существующий код является таким образом. Таким образом, решение Правда и ложь маскируются под 1 и 0 соответственно. Это всего лишь исторический артефакт языковой эволюции.
кредит идет к dman13 для этого славного объяснение.
посмотреть PEP 285 -- добавление типа bool. Соответствующий отрывок:
6) должен ли bool наследовать от int?
=> да.
в идеальном мире bool может быть лучше реализован как a отдельный целочисленный тип, который умеет выполнять смешанный режим арифметика. Однако, унаследовав от типа bool, int и облегчает реализация чрезвычайно (частично, так как весь код C, который вызывает PyInt_Check () будет продолжать работать -- это возвращает правда для подклассы int).
можно также использовать
help
проверитьBool
значение в консоли:help (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 |
help (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