Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mypy doesn't throw an error when mixing booleans with integers

I am trying to use mypy to check a Python 3 project. In the example below, I want mypy to flag the construction of the class MyClass as an error, but it doesn't.

class MyClass:
    def __init__(self, i:int) -> None:
        pass

obj = MyClass(False)

Can anyone explain this, please? I.e. explain why mypy does not report an error?

like image 434
ahnkle Avatar asked Nov 21 '19 11:11

ahnkle


1 Answers

It’s because — unfortunately! — booleans in Python are integers. As in, bool is a subclass of int:

In [1]: issubclass(bool, int)
Out[1]: True

Hence the code typechecks, and False is a valid integer with value 0.

like image 127
Konrad Rudolph Avatar answered Sep 21 '22 04:09

Konrad Rudolph