Почему bool является подклассом int? - PullRequest
76 голосов
/ 17 ноября 2011

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

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

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

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

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

Ответы [ 3 ]

91 голосов
/ 17 ноября 2011

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

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

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

Благодарность за это хорошее объяснение идет на dman13.

25 голосов
/ 17 ноября 2011

См. PEP 285. Добавление типа bool . Отбросить прохождение:

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

=> Да.

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

0 голосов
/ 23 января 2018

Можно также использовать 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
...