Comparing boolean and int using isinstance Comparing boolean and int using isinstance python python

Comparing boolean and int using isinstance


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 an int, 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 handlingelif isinstance(whatever, (float, int)):    # other handling
  • If you want to detect objects whose specific class is exactly float or int, 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.


Yes, this is right, it's a subclass of int, you can verify it using the interpreter:

>>> int.__subclasses__()[<type 'bool'>]


If you only want to check for int:

if type(some_var) is int:    return Trueelse:    return False