You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写动态函数提取嵌套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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 03:09:59