Why is bool a subclass of int?

Python Programming

Question or problem about Python programming:

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)….

How to solve the problem:

Solution 1:

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:

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:

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

Hope this helps!