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


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

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

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

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

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

3 74

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