Why is bool a subclass of int?
PythonBooleanPython 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