Python 类中的类型检查

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

我正在尝试使用静态类型检查工具来检查变量的赋值是否错误。例如,将字符串分配给 int 变量。

我尝试了pytypemypy。两者都没有给我任何警告。

class A:
    def __init__(self):
        self.x : int = None

if __name__ == '__main__':
    a = A()
    a.x = 'abc'
    print(a.x)

我希望静态类型检查工具可以在上面的行上给我一个警告:

a.x = 'abc'

我需要使用一些选项或其他辅助工具来检测这种赋值语句吗?

python mypy python-typing pytype
2个回答
1
投票

因此,当我复制您的代码并使用 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 程序

来自文档


0
投票

我不能代表其他 IDE,但对于 Visual Studio Code(使用 Python 3.8.5)...

  1. 安装pylance(微软的Python语言服务器扩展)

  2. 将这两行添加到settings.json:

    "python.languageServer":"Pylance",
    "python.analysis.typeCheckingMode" :"strict"
    
  3. 注意报告的以下问题:

    (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]
    
© www.soinside.com 2019 - 2024. All rights reserved.