检查类__init__参数

问题描述 投票:3回答:2

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

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

obj = MyClass(False)

任何人都可以解释一下吗?

编辑:即解释为什么mypy不报告错误?

python mypy
2个回答
3
投票

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

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

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


0
投票

实际上您是对的:

从文档(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个源文件)

© www.soinside.com 2019 - 2024. All rights reserved.