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