如果 mypy 声明了 return 类型,它是否只对函数进行类型检查?

Does mypy only type check a function if it declares a return type?

以下文件:

from typing import List

class A:

def __init__(self, myStr):
    self.chars: List[int] = list(myStr)

def toString(self):
    return "".join(self.chars)

typechecks(注意字符应该是 List[str] 而不是 List[int]):➜ Python python3 -m mypy temp.py => Success: no issues found in 1 source file,但是下面的一个,我声明了 toString 的 return 类型,确实:

from typing import List

class A:

def __init__(self, myStr):
    self.chars: List[int] = list(myStr)

def toString(self) -> str:
    return "".join(self.chars)

➜  Python python3 -m mypy temp.py
temp.py:9: error: Argument 1 to "join" of "str" has incompatible type "List[int]"; expected "Iterable[str]"
Found 1 error in 1 file (checked 1 source file)

谁能解释一下 mypy 在这种情况下的行为?为什么我需要在函数中加入return类型来强制mypy正确诊断问题? (它已经有了所有必要的信息:chars 是 List[int] 并且 join 接受 Iterable[str])

mypy 的这种行为是设计使然。 Mypy 假定如果函数签名缺少类型提示,则用户不希望对该函数进行类型检查,因此会跳过分析该函数体。

此行为的目的是在处理大型代码库时更轻松地逐步添加类型提示:您最终只会收到有关您有机会检查和迁移的功能的警告,而不是被一堵警告墙击中前面.

如果您不喜欢这种行为并且希望 mypy 无论如何都尝试类型检查函数体,请传入 --check-untyped-defs command line flag (or config file option).

或者,如果您希望 mypy 在您忘记添加类型签名时发出警告,请使用 --disallow-untyped-defs and --disallow-incomplete-defs 标志。

--strict 标志还可以启用所有这三个标志,以及其他标志。您可以 运行 mypy --help 自己仔细检查一下。