如何将含动态键的字典转换为Python dataclass?
解决方案
核心思路
由于字典的键是动态生成且不符合Python变量名规范(UUID含横杠、数字字符串以数字开头),需要分两步处理:
- 将非法键转换为合法的Python变量名
- 利用
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
相关产品推荐
相关产品推荐

