如何在几个别名上定义递归Python类型?

如何在几个别名上定义递归Python类型?,python,mypy,python-typing,Python,Mypy,Python Typing,我想要这个逻辑类型结构: ObjectType=Dict[str,'EntryType'] ListType=List['EntryType'] EntryType=Union[str,'ListType','ObjectType'] mypy报告以下错误: mdl/structure.py:7: error: Cannot resolve name "ObjectType" (possible cyclic definition) mdl/structure.py:7: error: Can

我想要这个逻辑类型结构:

ObjectType=Dict[str,'EntryType']
ListType=List['EntryType']
EntryType=Union[str,'ListType','ObjectType']
mypy
报告以下错误:

mdl/structure.py:7: error: Cannot resolve name "ObjectType" (possible cyclic definition)
mdl/structure.py:7: error: Cannot resolve name "EntryType" (possible cyclic definition)
mdl/structure.py:8: error: Cannot resolve name "ListType" (possible cyclic definition)
...
有没有办法对这种递归数据类型进行编码


我相信我可以内联各个类型,每次输入完整的定义,以允许递归。我宁愿避免这种情况,因为它体积庞大,不太清晰。

mypy不支持递归类型:

您的类型定义对于mypy是不可能的,对于我所知道的任何其他类型检查器也是不可能的。内联各个类型将为您提供无限长的类型定义,因为它是递归的。

递归类型是。不过,它们肯定在路线图上,尽管我不确定何时开始实施工作。它原定于今年早些时候开始,但语义分析阶段的先决条件重构(进行了大量内部更改以清晰地支持递归类型)最终花费了比预期更长的时间,因此我不确定新的时间表是什么。也许在下半年左右的某个时候

您可以研究的一种可能的替代方法是使用,它允许您将特定类型分配给某些键。如果您已经提前知道输入dict的结构是什么——如果您确切地知道对象类型将具有哪些键,以及它们将映射到哪些键,那么这一点尤其有用。如果您更喜欢使用对象而不是dict,并且不必编写大量验证逻辑,那么像这样的库在这里也很有用

但从实用角度讲,如果您的dict结构是真正自由形式的,那么最好只使用
ObjectType=dict[str,object]
。毕竟,为了准确地识别您正在处理的EntryType,您必须添加一些isinstance检查以适当地缩小类型。因此,虽然从
object
开始,而不是从
Union[str,ListType,ObjectType]
开始会有点烦人,但根据您所做的事情,这可能不会造成太大的负担