使用不带类型注释的mypy检测类型错误

2024-05-17 08:08:50 发布

您现在位置:Python中文网/ 问答频道 /正文

以下脚本包含故意类型错误:

def foo(x, y):
    print(x[:y])

def main():
    foo('abcde', '2')

if __name__ == "__main__":
    main()

可以通过运行它来确认错误:

$ python3 untyped_test.py 
Traceback (most recent call last):
  File "untyped_test.py", line 8, in <module>
    main()
  File "untyped_test.py", line 5, in main
    foo('abcde', '2')
  File "untyped_test.py", line 2, in foo
    print(x[:y])
TypeError: slice indices must be integers or None or have an __index__ method

但是,我希望不仅在运行时,而且在执行代码之前,使用以下方法捕获类似的内容:

mypy --check-untyped-defs untyped_test.py 

但没有发现任何错误:

$ mypy --check-untyped-defs untyped_test.py 
$ mypy --version
mypy 0.590

仅当我注释foo

def foo(x: str, y: int):
    print(x[:y])

我得到:

untyped_test.py:5: error: Argument 2 to "foo" has incompatible type "str"; expected "int"

在没有任何手动类型注释的情况下,是否可以找到这样的错误?你知道吗


Tags: orinpytest类型foomaindef
1条回答
网友
1楼 · 发布于 2024-05-17 08:08:50

这在mypy中是不可能做到的。Mypy遵循PEP 484语义,即如果函数的参数没有注释,则假定它们具有Any类型,表示未知类型的完全动态值。你知道吗

这个决定是有意的。这在一定程度上是因为进行整个程序的类型推断是有挑战性的,尤其是在允许对象、子类型、可变性等等的情况下:要求用户在“边界”处修复类型有助于使类型暗示易于处理。你知道吗

这在一定程度上也有助于确保向后兼容性。有可能是以一种有意义的方式设计的动态和非类型化的代码。如果您想在现有项目中引入类型暗示,这一点尤其有用:默认情况下,所有内容都被认为是动态类型的,这样您就可以缓慢地添加类型,而不会被错误淹没。(这是我的梦想,至少我不认为mypy会让你这么做。)

也就是说,有一些人试图实现整个程序类型推断,例如pytype项目。然而,我的理解是,它仍然是非常阿尔法阶段。你知道吗

相关问题 更多 >