我试图定义一种类型,它表示一个具有一般简单值但可以嵌套的字典:
_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”
为了防止|
运算符只适用于更简单的类型,我尝试:
_InfoVal = Union(str, int, 'TemplateInfo')
甚至:
_InfoVal = Union('str', 'int', 'TemplateInfo')
在这种情况下,犯了一个更奇怪的错误:
… (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中建立一个包含前向类型的联合呢?
发布于 2022-02-25 23:45:10
我仍然觉得这种行为出乎意料,也很奇怪,但我确实找到了解决办法。通过翻转我的定义,可以将“联合”部分与“向前引用”部分分开:
TemplateInfo: TypeAlias = dict[str, '_InfoVal']
_InfoVal: TypeAlias = str | int | TemplateInfo
也就是说,它首先使用一个隐含的前向引用来表示什么将是联盟,然后有一个可以在实际的联合中使用的“活动”引用。
https://stackoverflow.com/questions/71272841
复制相似问题