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

时间:2019-02-28 10:16:51

标签: python annotations typing mypy

Mypy在此行出错:

response = {'available_fields': []}

error: Need type annotation for 'response'

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

response: typing.Dict = {'available_fields': []}

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

1 个答案:

答案 0 :(得分:1)

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

当您执行类似操作...

response: Dict = {'foo': []}

... mypy将使用Any, the dynamic type自动为字典填充缺少的类型参数。因此,以上声明完全等同于:

response: Dict[Any, Any] = {'foo': []}

也就是说,您的键实际上可以是任何内容(不仅是字符串),并且值也可以是任何内容(不仅是列表)。


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

# For example:
response: Dict[str, List[str]] = {'foo': []}

...或(b),如果您的字典比较复杂,请使用TypedDict


如果您希望mypy禁止您省略通用类型的参数(例如,禁止仅执行response: Dict = ...),请使用--disallow-any-generics command line flag。如果不想每次运行mypy都输入该标志,也可以将此选项添加到config file中。