python - 使用 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 时。
解决方案
字典通常用作键集合,最重要的操作是查找与任意键关联的值。通常在字典中,每个键都具有相同的类型,每个值都具有相同的类型;如果值是异构的,则表达式ranges[key]
不一定具有特定类型(尽管您可以将其表示为联合)。
在您的代码中,静态分析器试图推断您的字典的类型。它期望的类型是Dict[K, V]
whereK
和V
尚未确定的形式。第一个作业ranges['max'] = 0
给出了关于两个未知数的信息:K
似乎是str
和V
似乎是int
。所以此时,ranges
被推断为 type Dict[str, int]
。
接下来的两行会给出错误,因为空列表不能用作 a 中的值Dict[str, int]
,并且 a 中的值Dict[str, int]
没有append
方法。
显式类型注释ranges: dict = dict()
通过指定这是一个异构字典来推翻默认行为,因此值不必都具有相同的类型。鉴于该信息,静态分析器不会假设因为其中一个值是 an int
,所以它们都必须是int
s。
推荐阅读
- powershell - Powershell脚本对文件进行排序并将它们放入不同名称的各个文件夹中
- azure-devops - 如何在 Azure DevOps Server 2020 中包含带有共享 YAML 模板的 PS 代码?
- adobe-illustrator - 使用 Python 编写 Adobe Illustrator 脚本
- c# - Mutltitarget 无需修改 csproj 格式
- httpclient - 用于 HttpClient 模拟的 SPN
- postgresql - Postgresql - 树状/树状基于计数的查询
- html - 与声明元素时将元素放在 id 或 class 前面有什么区别?
- html - Html - 底部的联系信息
- python - Postgresql 无法将角色更改为超级用户
- windows-server-2016 - 如何撤消在 Windows 2016 服务器上使用 FTPS 所做的更改