有人可以解释为什么这段代码有效时会使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时。
字典通常用作键集合,最重要的操作是查找与arbitrary键相关的值。通常,在字典中,每个键都具有相同的类型,而每个值都具有相同的类型;如果值是异构的,则表达式ranges[key]
不一定具有特定的类型(尽管您可以将其表示为联合)。
在您的代码中,静态分析器正在尝试推断词典的类型。它期望的类型是Dict[K, V]
的形式,其中K
和V
尚未确定。第一个分配ranges['max'] = 0
提供有关两个未知数的信息:K
似乎是str
,V
似乎是int
。因此,在这一点上,ranges
被推断为类型Dict[str, int]
。
接下来的两行会出错,因为不能将空列表用作Dict[str, int]
中的值,并且Dict[str, int]
中的值没有append
方法。
显式类型注释ranges: dict = dict()
通过指定这是一个异构字典来推翻默认行为,从而使值不必都具有相同的类型。有了这些信息,静态分析器就不会认为因为其中一个值是int
,所以它们都必须是int
。