首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用Python类型定义递归联合?

如何使用Python类型定义递归联合?
EN

Stack Overflow用户
提问于 2022-02-25 23:41:08
回答 1查看 128关注 0票数 1

我试图定义一种类型,它表示一个具有一般简单值但可以嵌套的字典:

代码语言:javascript
运行
复制
_InfoVal: TypeAlias = str | int | ForwardRef('TemplateInfo')
TemplateInfo: TypeAlias = dict[str, _InfoVal]

也就是说,对象可以是{'myvar': "Some content", 'val': 1}{'name': "A Label", 'info': {'details': "Nested Content", 'price': 123}}。可以这样想,定义可以嵌套但稍微简单一些的JSON对象的类型。

我的问题是,当我这样做的时候,我会得到一个错误,比如:

TypeError:不支持的操作数类型(S),用于“types.UnionType”和“ForwardRef”

或者在更简单的情况下不使用显式ForwardRef

TypeError:不支持的操作数类型(S),用于“types.UnionType”和“str”

为了防止|运算符只适用于更简单的类型,我尝试:

代码语言:javascript
运行
复制
_InfoVal = Union(str, int, 'TemplateInfo')

甚至:

代码语言:javascript
运行
复制
_InfoVal = Union('str', 'int', 'TemplateInfo')

在这种情况下,犯了一个更奇怪的错误:

代码语言:javascript
运行
复制
… (snip) …
    _InfoVal = Union('str', 'int', 'TemplateInfo')
File "/usr/local/lib/python3.10/typing.py", line 386, in __call__
    raise TypeError(f"Cannot instantiate {self!r}")
TypeError: Cannot instantiate typing.Union

为什么我不能在Python3.10.1中建立一个包含前向类型的联合呢?

EN

Stack Overflow用户

发布于 2022-02-25 23:45:10

我仍然觉得这种行为出乎意料,也很奇怪,但我确实找到了解决办法。通过翻转我的定义,可以将“联合”部分与“向前引用”部分分开:

代码语言:javascript
运行
复制
TemplateInfo: TypeAlias = dict[str, '_InfoVal']
_InfoVal: TypeAlias = str | int | TemplateInfo

也就是说,它首先使用一个隐含的前向引用来表示什么将是联盟,然后有一个可以在实际的联合中使用的“活动”引用。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71272841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档