Python中Union类型是否支持递归引用自身作为成员?
问题解答
可以创建包含自引用的Union类型,你遇到的报错是Python类型注解的前向引用问题:定义Serialized类型别名时,赋值语句还没执行完成,作用域里还不存在Serialized这个名字,因此直接引用会抛出未定义的错误。
目前有三种兼容性不同的解决方案:
方案1:启用延迟注解解析(Python 3.7+ 适用)
在文件最顶部导入from __future__ import annotations,该配置会将文件内所有类型注解转为字符串格式延迟到类型检查阶段再解析,运行时不会触发未定义报错:
from __future__ import annotations from typing import List, Dict, Union class MyClass: Serialized = Union[Dict[str, Serialized], List[Serialized], str, int, float, bool] def serialize(self) -> Serialized: # 序列化实现逻辑 ...
方案2:字符串形式写自引用(全Python版本兼容)
不需要额外导入,直接把还没定义的自引用类型名用引号包裹,类型检查器会自动识别字符串对应的类型,运行时也不会报错:
from typing import List, Dict, Union class MyClass: Serialized = Union[Dict[str, 'Serialized'], List['Serialized'], str, int, float, bool] def serialize(self) -> 'Serialized': # 序列化实现逻辑 ...
方案3:新版Python简化写法(Python 3.12+ 适用)
Python 3.12 引入了PEP 695的类型别名专用语法,原生支持自引用类型的解析,写法更简洁语义更清晰:
from typing import List, Dict class MyClass: type Serialized = dict[str, Serialized] | list[Serialized] | str | int | float | bool def serialize(self) -> Serialized: # 序列化实现逻辑 ...
以上三种写法都可以被mypy、pyright等主流Python类型检查器正确识别,完全符合类型规范。
内容的提问来源于stack exchange,提问作者Aart Stuurman
相关产品推荐
相关产品推荐

