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

2024-09-28 22:19:01 发布

您现在位置:Python中文网/ 问答频道 /正文

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

ObjectType = Dict[str, 'EntryType']
ListType = List['EntryType']
EntryType = Union[str, 'ListType', 'ObjectType']

mypy报告以下错误:

^{pr2}$

有什么方法可以对这种递归数据类型进行编码吗?在

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


Tags: 方法类型报告错误逻辑结构dictlist
2条回答

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开始而不是{}会有点烦人,但根据你所做的,这可能不是一个太大的负担。在

相关问题 更多 >