以下脚本包含故意类型错误:
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"
在没有任何手动类型注释的情况下,是否可以找到这样的错误?你知道吗
这在mypy中是不可能做到的。Mypy遵循PEP 484语义,即如果函数的参数没有注释,则假定它们具有
Any
类型,表示未知类型的完全动态值。你知道吗这个决定是有意的。这在一定程度上是因为进行整个程序的类型推断是有挑战性的,尤其是在允许对象、子类型、可变性等等的情况下:要求用户在“边界”处修复类型有助于使类型暗示易于处理。你知道吗
这在一定程度上也有助于确保向后兼容性。有可能是以一种有意义的方式设计的动态和非类型化的代码。如果您想在现有项目中引入类型暗示,这一点尤其有用:默认情况下,所有内容都被认为是动态类型的,这样您就可以缓慢地添加类型,而不会被错误淹没。(这是我的梦想,至少我不认为mypy会让你这么做。)
也就是说,有一些人试图实现整个程序类型推断,例如pytype项目。然而,我的理解是,它仍然是非常阿尔法阶段。你知道吗
相关问题 更多 >
编程相关推荐