python - dict的dict上的Mypy错误:“object”类型的值不可索引
问题描述
我在 python 上有以下字典:
dictionary = {
'key1': 1,
'sub_dict': {'key2': 0},
}
当我在以下行上运行 mypy 时:
print(dictionary['sub_dict']['key2'])
它引发了错误Value of type "object" is not indexable
解决方案
静态类型很棘手。mypy
可以确定 的值dictionary
并非都具有相同的类型,但仅此而已。的静态类型dictionary
是Dict[str,object]
,基于初始值。但是,mypy
不会尝试进一步模拟代码,这意味着它不知道在您尝试使用 索引它时d['sub_dict']
是否仍然是另一个,这会导致类型错误。dict
key2
您可以做的一件事是mypy
通过告诉它可以将特定值视为具有特定类型来提供帮助,使用typing.cast
.
print(typing.cast(typing.Dict[str,dict], d['sub_dict'])['key2'])
在运行时,typing.cast
实际上是一个身份函数;它只返回它的第二个参数。mypy
将其视为更强的类型提示,表示无论先前的任何提示或注释如何,d['sub_dict']
都应视为Dict[str,dict]
.
但是请注意,通过使用,cast
您是在告诉您要负责确保它实际上是在运行时 a ,因为这不是您可以用静态类型传达的东西。你可能会认为像mypy
dictionary['sub_dict']
dict
dictionary : Dict[str,Union[int,dict]] = ...
会起作用,但这只是说明mypy
write 将是类型错误dictionary['foo'] = 'bar'
,因为'bar'
既不是 an 也不是int
a dict
。即使有更准确的类型提示,仍然无法mypy
知道dictionary
将任何特定键映射到哪种类型的值。
你也可以使用Any
:
dictionary: Dict[str,Any] = ...
因为现在你说任何类型都可以作为值,任何类型都可以假定为索引的结果,这两种类型不必排成一行。也就是说,dictionary['key1'] = 3
很好,因为int
与 兼容Any
,但dictionary['sub_dict']['key2']
也很好,因为dictionary['sub_dict']
产生的任何东西也与 兼容Any
,并且您可以假设该类型本身是可索引的。实际上,它涵盖了代码中任何地方的任何使用,而不是您用来断言应该允许什么dictionary
的特定位置。cast
主要题外话:有一个依赖类型的概念,最简单的例子是一个类似的类型,除了它不允许负值外,它PositiveInt
是相同的。似乎具有类似的依赖类型,其中值的类型实际上是存储在值中的实际数据的函数。例如,假设您可以使用with的实例来指定其值的类型。int
dictionary
dict
Dict
dictionary: Dict[str, {"key1": int, "sub_dict": dict}] = {'key1': 1,
'sub_dict': {'key2': 0}
}
现在,不仅可以mypy
看出它dictionary['key1']
应该是一个int
,而且它dictionary
本身永远不能有除and之外的任何键。(在这个假设的世界中, a可以将任意未指定的键映射到默认类型。)key1
sub_dict
defaultdict
推荐阅读
- ios - FlatList onEndReached 被多次调用
- android - ExpandableListView 不显示 Viewpager android 中的最后一项
- apache - Apache调度程序在日志中获取标题内容
- angular - 以角度 6 对对象数组进行排序
- javascript - Microsoft Edge 中的动画渲染效果不佳
- windows - Window Server 2016 上的 Portainer 设置
- android - 如何在除 Activity 之外的任何地方注入 Dagger 依赖项?
- python - 位置参数跟随关键字参数 | 调用函数时出错
- kotlin - 泛型函数中的多个参数
- python-3.x - 按天计算的平均值