有人可以解释为什么这段代码虽然有效,但却使 mypy 静态分析器以多种方式抱怨:
ranges = dict()
ranges['max'] = 0
ranges['services'] = []
ranges['services'].append('a')
Run Code Online (Sandbox Code Playgroud)
即:
ranges = dict()
ranges['max'] = 0
ranges['services'] = []
ranges['services'].append('a')
Run Code Online (Sandbox Code Playgroud)
如果我简单地向初始变量添加类型提示,ranges: 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它们都必须是ints。
| 归档时间: |
|
| 查看次数: |
3389 次 |
| 最近记录: |