我想要这个逻辑类型结构:
from typing import List, Dict, Union
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 尚不支持。尽管我不确定实施工作何时开始,但它们肯定在路线图上。它原定于今年早些时候开始,但语义分析阶段的先决条件重构(这使得干净地支持递归类型所需的大量内部更改)最终花费了比预期更长的时间,所以我不确定新的是什么时间表是。也许在接下来的半年左右的某个时候?
您可以研究的一种可能的替代方法是使用类型字典,它允许您将特定类型分配给某些键。如果您已经提前知道输入字典的结构是什么,那么这尤其有用 - 如果您确切地知道您的 ObjectType 将具有哪些键,以及它们将映射到什么。图书馆喜欢pydantic如果您更喜欢使用对象而不是字典并且不想编写一堆验证逻辑,那么这里也很有帮助。
但实际上,如果您的字典结构确实是自由格式的,那么最好选择ObjectType = Dict[str, object]
。毕竟,为了准确识别您正在处理的 EntryType,无论如何您都必须添加一些 isinstance 检查以适当缩小类型。所以,在开始时object
代替Union[str, ListType, ObjectType]
会有点烦人,根据你在做什么,它可能不会太大。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)