首页 > 解决方案 > 使用 Python dicts 进行静态类型分析

问题描述

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

标签: pythonmypy

解决方案


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

在您的代码中,静态分析器试图推断您的字典的类型。它期望的类型是Dict[K, V]whereKV尚未确定的形式。第一个作业ranges['max'] = 0给出了关于两个未知数的信息:K似乎是strV似乎是int。所以此时,ranges被推断为 type Dict[str, int]

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

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


推荐阅读