有人可以解释为什么此代码有效时为何使mypy静态分析器以多种方式抱怨:

ranges = dict()
ranges['max'] = 0
ranges['services'] = []
ranges['services'].append('a')

即:

error: Incompatible types in assignment (expression has type "List[<nothing>]", target has type "int")

error: "int" has no attribute "append"

如果我只是将类型提示添加到ranges: dict = dict()的初始变量中,则效果很好。

我对为什么静态分析器不能自己解决这个问题感到困惑,尤其是当我在第一次使用dict关键字初始化dict时。

最佳答案

字典通常用作键集合,最重要的操作是查找与任意键关联的值。通常,在字典中,每个键都具有相同的类型,而每个值都具有相同的类型;如果值是异构的,则表达式ranges[key]不一定具有特定类型(尽管您可以将其表示为联合)。

在您的代码中,静态分析器正在尝试推断词典的类型。它期望的类型是Dict[K, V]形式,其中KV尚未确定。第一个赋值ranges['max'] = 0提供有关两个未知数的信息:K似乎是str,而V似乎是int。因此,在这一点上,ranges被推断为Dict[str, int]类型。

接下来的两行会出错,因为不能将空列表用作Dict[str, int]中的值,并且Dict[str, int]中的值没有append方法。

显式类型批注ranges: dict = dict()通过指定这是一个异构字典来推翻默认行为,从而使值不必都具有相同的类型。有了这些信息,静态分析器就不会假设因为值之一是int,所以它们都必须是int

10-07 14:17
查看更多