为什么当 mypy 需要类型注释时,愚蠢的注释会处理错误?

san*_*ash 4 python annotations type-hinting mypy python-typing

Mypy 在这一行出错:

response = {'available_fields': []}

error: Need type annotation for 'response'
Run Code Online (Sandbox Code Playgroud)

当我添加响应是字典的愚蠢注释时,错误消失了:

response: typing.Dict = {'available_fields': []}
Run Code Online (Sandbox Code Playgroud)

所以,我对此有一些疑问。为什么愚蠢的注释会处理错误?如何调整 mypy(配置、选项等)而不担心没有注释的这一行?

Mic*_*x2a 5

问题是 mypy 不知道你的列表应该包含什么。它是一个字符串列表吗?整数列表?还有别的事吗?

当你做类似的事情时...

response: Dict = {'foo': []}
Run Code Online (Sandbox Code Playgroud)

Any...mypy 将自动使用动态类型来填充 dict 缺少的类型参数。所以,上面的声明完全等同于:

response: Dict[Any, Any] = {'foo': []}
Run Code Online (Sandbox Code Playgroud)

也就是说,你的键实际上可以是任何东西(不仅仅是字符串),值也可以是任何东西(不仅仅是列表)。


在您的情况下,您可能应该 (a) 在注释中填写预期的键和值类型:

# For example:
response: Dict[str, List[str]] = {'foo': []}
Run Code Online (Sandbox Code Playgroud)

...或者 (b),如果您的字典更复杂,请使用TypedDict 。


如果您希望 mypy 禁止您省略泛型类型中的参数(例如禁止仅执行response: Dict = ...),请使用--disallow-any-generics命令行标志。如果您不想每次运行 mypy 时都键入该标志,您也可以将此选项添加到配置文件中。