gpt4 book ai didi

python - 我怎样才能在多个别名上定义一个递归的 Python 类型?

转载 作者:太空宇宙 更新时间:2023-11-03 23:54:22 25 4
gpt4 key购买 nike

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

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

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

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

最佳答案

递归类型是 not yet supported in mypy .虽然他们肯定在路线图上,但我不确定实现工作何时开始。它原定于今年早些时候开始,但语义分析阶段的先决条件重构(它进行了大量内部更改以干净地支持递归类型)最终花费的时间比预期的要长,所以我不确定新的是什么时间表是。也许在下半年左右的某个时候?

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

不过从实用的角度来说,如果您的字典结构是真正的自由格式,那么最好只使用 ObjectType = Dict[str, object]。毕竟,为了准确识别您正在处理的 EntryType,无论如何您都必须添加一些 isinstance 检查以适当缩小类型。因此,虽然从 object 而不是 Union[str, ListType, ObjectType] 开始会有点烦人,但根据您的情况,它可能不会太过分正在做。

关于python - 我怎样才能在多个别名上定义一个递归的 Python 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58377361/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com