如何编写动态函数提取嵌套TypedDict的扁平化键?
递归提取嵌套TypedDict的扁平化键列表
先明确给定的TypedDict定义:
from typing import TypedDict class MySubClass(TypedDict): name: str color: str class MyClass(TypedDict): x: MySubClass y: str
实现递归扁平化函数
下面的函数可以递归遍历嵌套的TypedDict结构,将嵌套键用下划线拼接生成扁平化列表,支持任意深度嵌套,还能处理被Optional、Union等包装的TypedDict类型:
from typing import get_origin, get_args, TypedDict def flatten_typed_dict_keys(td_class: type[TypedDict], parent_key: str = "") -> list[str]: flattened = [] # 遍历TypedDict的所有字段注解 for key, annotation in td_class.__annotations__.items(): # 拼接当前键与父键前缀 current_key = f"{parent_key}_{key}" if parent_key else key # 判断当前注解是否为TypedDict类型 origin_type = get_origin(annotation) # 直接是TypedDict子类的情况 if origin_type is None and issubclass(annotation, TypedDict): flattened.extend(flatten_typed_dict_keys(annotation, current_key)) # 处理被Union、Optional等包装的TypedDict elif origin_type is not None: for arg in get_args(annotation): if issubclass(arg, TypedDict): flattened.extend(flatten_typed_dict_keys(arg, current_key)) # 非嵌套字段直接加入结果 else: flattened.append(current_key) return flattened
测试验证
调用函数测试给定的TypedDict:
if __name__ == "__main__": print(flatten_typed_dict_keys(MyClass)) # 输出: ['x_name', 'x_color', 'y']
扩展说明
- 支持任意深度嵌套:如果
MySubClass里还有嵌套的TypedDict,函数会自动递归处理 - 兼容包装类型:字段类型是
Optional[MySubClass]或Union[MySubClass, OtherType]时,能识别并提取嵌套键 - 键名规则:父键与子键用下划线连接,顶层键保留原名称
内容的提问来源于stack exchange,提问作者bayerb
相关产品推荐
相关产品推荐

