Why is bool a subclass of int?

PythonBoolean

Python Problem Overview


When storing a bool in memcached through python-memcached I noticed that it's returned as an integer. Checking the code of the library showed me that there is a place where isinstance(val, int) is checked to flag the value as an integer.

So I tested it in the python shell and noticed the following:

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

But why exactly is bool a subclass of int?

It kind of makes sense because a boolean basically is an int which can just take two values but it needs much less operations/space than an actual integer (no arithmetics, only a single bit of storage space)....

Python Solutions


Solution 1 - Python

From a comment on http://www.peterbe.com/plog/bool-is-int

> It is perfectly logical, if you were around when the bool type was > added to python (sometime around 2.2 or 2.3). > > Prior to introduction of an actual bool type, 0 and 1 were the > official representation for truth value, similar to C89. To avoid > unnecessarily breaking non-ideal but working code, the new bool type > needed to work just like 0 and 1. This goes beyond merely truth value, > but all integral operations. No one would recommend using a boolean > result in a numeric context, nor would most people recommend testing > equality to determine truth value, no one wanted to find out the hard > way just how much existing code is that way. Thus the decision to make > True and False masquerade as 1 and 0, respectively. This is merely a > historical artifact of the linguistic evolution.

Credit goes to dman13 for this nice explanation.

Solution 2 - Python

See PEP 285 -- Adding a bool type. Relevent passage:

> 6) Should bool inherit from int? > > => Yes. > > In an ideal world, bool might be better implemented as a > separate integer type that knows how to perform mixed-mode > arithmetic. However, inheriting bool from int eases the > implementation enormously (in part since all C code that calls > PyInt_Check() will continue to work -- this returns true for > subclasses of int).

Solution 3 - Python

Can also use help to check the Bool's value in Console:

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionThiefMasterView Question on Stackoverflow
Solution 1 - PythonPolynomialView Answer on Stackoverflow
Solution 2 - PythonSteven RumbalskiView Answer on Stackoverflow
Solution 3 - PythonaircraftView Answer on Stackoverflow