我正在尝试使用静态类型检查工具来检查变量的赋值是否错误。例如,将字符串分配给 int 变量。
我尝试了pytype和mypy。两者都没有给我任何警告。
class A:
def __init__(self):
self.x : int = None
if __name__ == '__main__':
a = A()
a.x = 'abc'
print(a.x)
我希望静态类型检查工具可以在上面的行上给我一个警告:
a.x = 'abc'
我需要使用一些选项或其他辅助工具来检测这种赋值语句吗?
因此,当我复制您的代码并使用 mypy 检查时,我得到以下结果:
project\scratch.py:7: error: Incompatible types in assignment (expression has type "str", variable has type "int")
我通过执行
mypy path/to/file.py
发现了这个。
在 Visual Studio Code 内部,选择 mypy 作为 linter,会在
a
变量下划线并覆盖 mypy 错误。
所以我正确显示了警告错误代码;也许您的 IDE 未设置为处理它们。
注意:执行
python path/to/file.py
不会显示mypy错误,最有可能保持输入“软” - 这样代码仍然会执行,并且输入更多的是“提示”,而不是停止代码:
您始终可以使用 Python 解释器来运行静态类型的程序 程序,即使它们有类型错误: $ python3 程序
来自文档。
我不能代表其他 IDE,但对于 Visual Studio Code(使用 Python 3.8.5)...
安装pylance(微软的Python语言服务器扩展)
将这两行添加到settings.json:
"python.languageServer":"Pylance",
"python.analysis.typeCheckingMode" :"strict"
注意报告的以下问题:
(variable) x: None
Cannot assign member "x" for type "A"
Expression of type "None" cannot be assigned to member "x" of class "A"
Type "None" cannot be assigned to type "int"Pylance (reportGeneralTypeIssues) [3, 14]
(variable) x: Literal['abc']
Cannot assign member "x" for type "A"
Expression of type "Literal['abc']" cannot be assigned to member "x" of class "A"
"Literal['abc']" is incompatible with "int"Pylance (reportGeneralTypeIssues) [7, 7]