如何动态检查GenericAlias(Type)对象,获取其包含的类型?
解决Dataclass中类型化Tuple的元素类型获取问题
直接通过访问类型对象的__args__属性就能获取tuple的元素类型,这是Python中GenericAlias类型(即tuple[...]这类泛型别名)存储类型参数的内置属性。
示例代码
from dataclasses import dataclass, fields import types @dataclass class TupleContainer: tuple2: tuple[float, str] tuple1: tuple[int, ...] for field in fields(TupleContainer): t = field.type print(f"字段类型: {repr(t)}") # 检查是否是tuple的泛型别名类型 if isinstance(t, types.GenericAlias) and t.__origin__ is tuple: element_types = t.__args__ print(f"元素类型: {element_types}") # 区分固定长度和可变长度tuple if element_types[-1] is Ellipsis: print(f"可变长度tuple,元素统一类型: {element_types[0]}") else: print(f"固定长度tuple,各位置类型依次为: {element_types}") print("---")
输出结果
字段类型: tuple[float, str] 元素类型: (float, str) 固定长度tuple,各位置类型依次为: (float, str) --- 字段类型: tuple[int, ...] 元素类型: (int, Ellipsis) 可变长度tuple,元素统一类型: int ---
关键说明
- 当你使用
tuple[float, str]或tuple[int, ...]这类写法时,Python会创建一个types.GenericAlias对象,它不支持直接迭代或索引操作,必须通过__args__属性获取内部的类型参数。 __origin__属性用于确认这个泛型别名的原始类型(这里是tuple),避免误处理其他泛型类型(比如list[...])。- 对于可变长度的
tuple[int, ...],__args__的最后一个元素是Ellipsis,可以通过这个特征判断并提取统一的元素类型。
内容的提问来源于stack exchange,提问作者JoshuaF
相关产品推荐
相关产品推荐

