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

如何将含动态键的字典转换为Python dataclass?

解决方案

核心思路

由于字典的键是动态生成且不符合Python变量名规范(UUID含横杠、数字字符串以数字开头),需要分两步处理:

  1. 将非法键转换为合法的Python变量名
  2. 利用dataclasses.make_dataclass动态生成dataclass类并初始化实例

具体实现代码

处理UUID键的字典

from dataclasses import make_dataclass

# 示例字典
d = {
    "d9376e0a-b4cc-4cbc-abc2-f8ce6648941c": "some value",
    "d9376e0a-b4cc-4cbc-abc2-f8ce6648931d": "some value",
}

# 把UUID中的横杠替换为下划线,生成合法变量名
def uuid_to_var(uuid_str):
    return uuid_str.replace("-", "_")

# 构造dataclass字段列表:(变量名, 类型, 默认值)
fields = [(uuid_to_var(key), str, value) for key, value in d.items()]

# 动态创建dataclass类
UUIDData = make_dataclass("UUIDData", fields)

# 初始化实例并访问属性
uuid_instance = UUIDData()
print(uuid_instance.d9376e0a_b4cc_4cbc_abc2_f8ce6648941c)  # 输出: some value

处理数字字符串键的字典

percentages = {
    "10": "some value",
    "25": "some value",
    "50": "some value"
}

# 给数字开头的键加前缀,生成合法变量名
def num_key_to_var(num_str):
    return f"percent_{num_str}"

# 构造字段列表
percent_fields = [(num_key_to_var(key), str, value) for key, value in percentages.items()]

# 动态创建dataclass类
PercentageData = make_dataclass("PercentageData", percent_fields)

# 初始化实例并访问属性
percent_instance = PercentageData()
print(percent_instance.percent_10)  # 输出: some value

额外提示

  • 若需要保留原键与变量名的对应关系,可以维护一个映射字典,比如uuid_map = {k: uuid_to_var(k) for k in d},方便后续通过原键查找实例属性
  • 字段类型可根据实际值调整,比如值为数字时改用int/float,不确定类型可导入from typing import Any后使用Any
  • 若字典为空,生成的dataclass会无字段,使用前需做判空处理

内容的提问来源于stack exchange,提问作者Hackus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 07:50:14