我在
test.py
中有以下内容:
def f(x: int) -> float:
pass
if __name__=="__main__":
f(4)
当我运行
mypy --strict test.py
时,我没有收到任何错误。
我预计
mypy
能够推断出我的定义有问题f
。它显然没有 return
语句,并且永远不能返回浮点数。
我觉得这里有一些基本的东西我不明白。
return
语句是否存在可以静态检查。为什么mypy
会错过?
您使用的语法被识别为函数存根,而不是函数实现。
通常,函数存根写为:
def f(x: int) -> float: ...
但这只是为了方便
def f(x: int) -> float: pass
来自 mypy 文档:
功能体无法完全移除。按照惯例,我们将它们替换为
而不是...
语句。pass
由于 mypy 不会检查函数体中的存根,因此在这种情况下不会出现错误。正如 @domarm 在评论中指出的,在函数体中添加除
pass
之外的任何语句(甚至第二个 pass
语句)都会导致预期的 mypy 错误。