使用Python字典的静态类型分析

问题描述 投票:1回答:1

有人可以解释为什么这段代码有效时会使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时。

python mypy
1个回答
0
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.