Comparing boolean and int using isinstance
Yes, this is right, it's a subclass of int, you can verify it using the interpreter:
>>> int.__subclasses__()
[<type 'bool'>]
For historic reasons, bool
is a subclass of int
, so True
is an instance of int
. (Originally, Python had no bool type, and things that returned truth values returned 1 or 0. When they added bool
, True and False had to be drop-in replacements for 1 and 0 as much as possible for backward compatibility, hence the subclassing.)
The correct way to "solve" this depends on exactly what you consider the problem to be.
- If you want
True
to stop being anint
, well, too bad. That's not going to happen. If you want to detect booleans and handle them differently from other ints, you can do that:
if isinstance(whatever, bool): # special handling elif isinstance(whatever, (float, int)): # other handling
If you want to detect objects whose specific class is exactly
float
orint
, rejecting subclasses, you can do that:if type(whatever) in (float, int): # Do stuff.
- If you want to detect all floats and ints, you're already doing that.
You can see the method resolution order, and find all superclasses from there:
>>> bool.__mro__
(<class 'bool'>, <class 'int'>, <class 'object'>)