gpt4 book ai didi

python - 使用 Python dicts 进行静态类型分析

转载 作者:行者123 更新时间:2023-12-01 09:40:59 28 4
gpt4 key购买 nike

有人能解释一下为什么这段代码虽然有效,但会让 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] 形式,其中 KV 尚未确定。第一个赋值 ranges['max'] = 0 给出了关于两个未知数的信息:K 似乎是 strV 似乎是 int。所以此时,ranges被推断为类型Dict[str, int]

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

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

关于python - 使用 Python dicts 进行静态类型分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60280254/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com