将布尔值与整数混合时,Mypy不会引发错误

时间:2019-11-21 11:13:22

标签: python integer boolean mypy

我正在尝试使用mypy检查Python 3项目。在下面的示例中,我希望mypy将类MyClass的构造标记为错误,但事实并非如此。

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

obj = MyClass(False)

有人可以解释吗?即解释为什么mypy不报告错误?

2 个答案:

答案 0 :(得分:5)

这是因为-不幸的是! -Python中的布尔值是整数。与之类似,boolint的子类:

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

因此代码进行类型检查,并且False是值为0的有效整数。

答案 1 :(得分:1)

实际上您是对的:

从文档中(test.py的内容):

class C2:
    def __init__(self, arg: int):
        self.var = arg


c2 = C2(True)
c2 = C2('blah')

mypy test.py
$>test.py:11: error: Argument 1 to "C2" has incompatible type "str"; expected "int"

在1个文件中发现1个错误(已检查1个源

注释c2 = C2('blah')

class C2:
    def __init__(self, arg: int):
        self.var = arg


c2 = C2(True)

mypy test.py

Success: no issues found in 1 source file

由于某种原因,似乎布尔值之类的值被视为整数 并说明: https://github.com/python/mypy/issues/1757

表示

class C2:
def __init__(self, arg: bool):
    self.var = arg

# tHIx WORKS FINE
c2 = C2(true)
# tHIx DOES NOT WORK
c2 = C2(0)

test.py:10:错误:“ C2”的参数1具有不兼容的类型“ int”;预期的“布尔” 在1个文件中发现1个错误(检查了1个源文件)