Python中如何获取变量的完整泛型类型?
Python获取容器类型含内部元素类型的方案
现成第三方包方案
首推beartype,这是专门处理Python运行时类型的工具包,无需手动写递归逻辑,直接调用内置工具函数即可输出你需要的格式。
安装命令:pip install beartype
使用示例:
from beartype._util.text.utiltextrepr import represent_object foo = [1, 2, 3] print(represent_object(foo)) # 输出:list[int, int, int]
如果需要统一类型去重的输出格式,可以搭配beartype的类型判断工具实现。
轻量自定义实现方案
如果不想引入第三方依赖,几十行代码就能实现满足打印需求的类型获取函数,示例如下:
def get_full_type(var, deduplicate_elem=True): base_type = type(var).__name__ # 处理列表类型 if isinstance(var, list): if not var: return f"{base_type}[]" elem_types = [get_full_type(e) for e in var] if deduplicate_elem and len(set(elem_types)) == 1: return f"{base_type}[{elem_types[0]}]" return f"{base_type}[{', '.join(elem_types)}]" # 处理字典类型 if isinstance(var, dict): if not var: return f"{base_type}{{}}" item_types = [f"{get_full_type(k)}: {get_full_type(v)}" for k, v in var.items()] return f"{base_type}{{{', '.join(item_types)}}}" # 处理元组、集合等其他容器可自行按相同逻辑扩展 if isinstance(var, tuple): elem_types = [get_full_type(e) for e in var] return f"{base_type}[{', '.join(elem_types)}]" # 基础类型直接返回名称 return base_type # 测试用例 foo = [1, 2, 3] print(get_full_type(foo)) # 输出:list[int] bar = [1, "a", 3.14] print(get_full_type(bar)) # 输出:list[int, str, float] baz = {"name": "张三", "age": 18, "hobbies": ["游泳", "跑步"]} print(get_full_type(baz)) # 输出:dict[str: str, str: int, str: list[str]]
你可以根据自己的打印需求,扩展对元组、集合、自定义类等其他类型的处理逻辑。
内容的提问来源于stack exchange,提问作者Andreas Pettersson
相关产品推荐
相关产品推荐

