为什么 mypy --strict 不会在这个简单的代码中抛出错误?

Why does `mypy --strict` not throw an error in this simple code?

我在 test.py 中有以下内容:

def f(x: int) -> float:
    pass

if __name__=="__main__":
  f(4)

当我 运行 mypy --strict test.py 时,我没有收到任何错误。

我希望 mypy 能够推断出我的定义有问题 f。它显然没有 return 语句并且永远不会 return 浮点数。

我觉得这里有些基本的东西我不明白。 return 语句的存在(或不存在)是可以静态检查的。为什么 mypy 错过了?

您使用的语法被识别为函数存根,而不是函数实现。

通常情况下,函数存根写成:

def f(x: int) -> float: ...

但这只是为了方便

def f(x: int) -> float: pass

来自mypy documentation:

Function bodies cannot be completely removed. By convention, we replace them with ... instead of the pass statement.

由于 mypy 不检查存根的函数体,因此在这种情况下不会出现错误。正如@domarm 在评论中指出的那样,向函数体添加除 pass 之外的任何语句(即使是第二个 pass 语句)也会导致预期的 mypy 错误。