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


84

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

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

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

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

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



1
Стоит отметить, что, поскольку в Python все является объектом, с накладными расходами, которые используются, в значительной степени бессмысленно пытаться сэкономить место за счет boolуменьшения s. Если бы вы заботились об использовании памяти, для начала вы бы использовали другой язык.
kindall

Ответы:


102

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

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

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

Благодарим dman13 за это красивое объяснение.


2
Обратите внимание, что исторически это может быть правдой, но идиоматически вы видите много того, sum([f(value) for value in values])где f(x)находится какая-то функция фильтра, и вам нужно увидеть, сколько значений проходит фильтр.
Адам Смит

2
Лично я бы предпочел написать sum(1 for value in values if f(value)), но я действительно видел, как уважаемые люди выступают за числовые операции над bools.
Мариус Гедминас

29

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

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

=> Да.

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


0

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

помощь (правда)

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 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.