我如何使通过多个别名定义的递归Python类型?

问题描述 投票:1回答:2

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

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)
...

是否有某种方法可以编码此递归数据类型?

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

python mypy python-typing
2个回答
1
投票

递归类型为not yet supported in mypy。尽管我不确定执行工作何时开始,但它们绝对是在路线图上。它原定于今年年初开始,但是语义分析阶段的先决条件重构(进行了许多内部更改,以完全支持递归类型)最终花费的时间比预期的长,所以我不确定新的时间轴是。也许在下半年的某个时间?

您可以研究的一种可能的替代方法是使用TypedDicts,它使您可以将特定类型分配给某些键。如果您已经提前知道输入字典的结构,这将特别有用-如果您确切知道对象类型将具有哪些键以及它们将映射到什么。如果您更喜欢使用对象而不是字典,并且不想编写一堆验证逻辑,那么pydantic之类的库在这里也很有用。

尽管实用上,如果您的字典结构是真正的自由格式,则最好只使用ObjectType = Dict[str, object]。毕竟,为了准确地确定要处理的EntryType,无论如何都必须添加一些isinstance检查以适当地缩小类型。因此,虽然从object而不是Union[str, ListType, ObjectType]开始会有点烦人,但根据您的工作情况,可能不会施加太大的强制性。


1
投票

mypy不支持递归类型:https://github.com/python/mypy/issues/731

© www.soinside.com 2019 - 2024. All rights reserved.