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

use*_*882 5 python types type-hinting mypy

我有以下内容test.py

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

if __name__=="__main__":
  f(4)
Run Code Online (Sandbox Code Playgroud)

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

我预计mypy能够推断出我的定义有问题f。它显然没有return声明,并且永远不能返回浮点数。

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

MrB*_*men 4

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

通常,函数存根写为:

def f(x: int) -> float: ...
Run Code Online (Sandbox Code Playgroud)

但这只是为了方便

def f(x: int) -> float: pass
Run Code Online (Sandbox Code Playgroud)

来自 mypy文档

功能体无法完全去除。按照惯例,我们将它们替换为...而不是pass声明。

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