2024-09-28 22:19:01 发布
网友
我想要这个逻辑类型结构:
ObjectType = Dict[str, 'EntryType'] ListType = List['EntryType'] EntryType = Union[str, 'ListType', 'ObjectType']
mypy报告以下错误:
mypy
有什么方法可以对这种递归数据类型进行编码吗?在
我相信我可以内联各个类型,每次都键入完整的定义,以允许递归。我宁愿避免这个,因为它体积大,不太清楚。
mypy不支持递归类型:https://github.com/python/mypy/issues/731
你的类型定义对于mypy是不可能的,我知道的任何其他类型检查器也不可能。内联单个类型将为您提供无限长的类型定义,因为它是递归的。在
递归类型是not yet supported in mypy。尽管我不确定何时开始实施工作,但它们肯定在路线图上。它原定于今年早些时候开始,但语义分析阶段的先决条件重构(进行了大量内部更改以完全支持递归类型)最终花费了比预期更长的时间,因此我不确定新的时间表是什么。也许在下半年的某个时候?在
一种可能的替代方法是使用TypedDicts,它允许您将特定类型分配给特定的键。如果您已经提前知道了输入dict的结构,如果您确切地知道对象类型将具有哪些键,以及它们将映射到什么,那么这一点尤其有用。如果您喜欢使用对象而不是dict,并且不想编写一堆验证逻辑,那么像pydantic这样的库在这里也很有用。在
不过,从实用的角度来看,如果dict结构是真正的自由形式,那么最好使用ObjectType = Dict[str, object]。毕竟,为了准确地识别您正在处理的EntryType,您必须添加一些isinstance检查来适当地缩小类型。因此,虽然从object开始而不是{}会有点烦人,但根据你所做的,这可能不是一个太大的负担。在
ObjectType = Dict[str, object]
object
mypy不支持递归类型:https://github.com/python/mypy/issues/731
你的类型定义对于mypy是不可能的,我知道的任何其他类型检查器也不可能。内联单个类型将为您提供无限长的类型定义,因为它是递归的。在
递归类型是not yet supported in mypy。尽管我不确定何时开始实施工作,但它们肯定在路线图上。它原定于今年早些时候开始,但语义分析阶段的先决条件重构(进行了大量内部更改以完全支持递归类型)最终花费了比预期更长的时间,因此我不确定新的时间表是什么。也许在下半年的某个时候?在
一种可能的替代方法是使用TypedDicts,它允许您将特定类型分配给特定的键。如果您已经提前知道了输入dict的结构,如果您确切地知道对象类型将具有哪些键,以及它们将映射到什么,那么这一点尤其有用。如果您喜欢使用对象而不是dict,并且不想编写一堆验证逻辑,那么像pydantic这样的库在这里也很有用。在
不过,从实用的角度来看,如果dict结构是真正的自由形式,那么最好使用}会有点烦人,但根据你所做的,这可能不是一个太大的负担。在
ObjectType = Dict[str, object]
。毕竟,为了准确地识别您正在处理的EntryType,您必须添加一些isinstance检查来适当地缩小类型。因此,虽然从object
开始而不是{相关问题 更多 >
编程相关推荐