Чому bool є підкласом int?


84

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

Тому я протестував його в оболонці python і помітив наступне:

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

Але чому саме boolпідклас int?

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



1
Варто зазначити, що оскільки в Python все є об’єктом, із накладними витратами, що працюють, майже безглуздо намагатися заощадити простір, зменшуючи bools. Якби ви дбали про використання пам’яті, для початку ви б використовували іншу мову.
kindall

Відповіді:


101

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

Цілком логічно, якщо ви були поруч, коли тип bool був доданий до python (десь приблизно 2.2 або 2.3).

До введення дійсного типу bool 0 та 1 були офіційним поданням істинності, подібним до C89. Щоб уникнути непотрібного злому неідеального, але робочого коду, новий тип bool повинен працювати так само, як 0 і 1. Це виходить за рамки просто значення істини, але всіх інтегральних операцій. Ніхто не рекомендував би використовувати логічний результат у числовому контексті, ані більшість людей не рекомендували б перевіряти рівність, щоб визначити істинність, ніхто не хотів важко з’ясувати, наскільки існуючий код таким є. Таким чином, рішення прийняти справжній та помилковий маскарад як 1 та 0 відповідно. Це лише історичний артефакт мовної еволюції.

За це приємне пояснення заслуговує dman13.


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

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

28

Див. 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.