如何将Python dataclass转换为值为字符串字面量的字典?
问题背景
现有如下类实现:
class MessageHeader(BaseModel): message_id: uuid.UUID def dict(self, **kwargs): return json.loads(self.json())
当前需要满足以下要求:
- 调用
MessageHeader实例的dict方法时,返回字段值为字符串字面量的字典,期望输出格式为:
{'message_id': '383b0bfc-743e-4738-8361-27e6a0753b5a'}
- 不能使用
pydantic等第三方库 - 替换原有
json.loads(self.json())的实现,消除序列化/反序列化往返带来的不必要性能开销 - 实现更高效的dataclass到目标字典的转换逻辑
实现方案
直接基于Python标准库dataclasses模块的字段遍历能力实现,取值时对需要转字符串的特殊类型做显式转换即可,完全跳过JSON中间序列化步骤,性能远高于原方案。
完整实现代码:
import uuid from dataclasses import dataclass, fields @dataclass class BaseModel: def dict(self): res = {} # 遍历dataclass定义的所有字段 for f in fields(self): val = getattr(self, f.name) # 按需补充需要转字符串的类型,比如时间、枚举等都可以加在这里 if isinstance(val, uuid.UUID): val = str(val) res[f.name] = val return res @dataclass class MessageHeader(BaseModel): message_id: uuid.UUID
使用测试:
if __name__ == "__main__": header = MessageHeader(message_id=uuid.UUID("383b0bfc-743e-4738-8361-27e6a0753b5a")) print(header.dict()) # 输出: {'message_id': '383b0bfc-743e-4738-8361-27e6a0753b5a'}
方案优势
- 零第三方依赖,全部基于Python标准库实现
- 没有中间序列化/反序列化步骤,性能损耗极低
- 扩展灵活:后续如果有其他需要转字符串的字段类型(比如
datetime、枚举类),只需要在类型判断分支补充对应类型即可 - 如果存在嵌套dataclass、容器类型字段的场景,只需要增加对应递归处理分支即可,适配成本低
核心思路:不需要绕路JSON做类型转换,直接遍历字段取值,对需要输出为字符串的特殊类型手动调用
str()转换即可。如果你的BaseModel不是标准库dataclass,只要能拿到实例的字段和值映射,这套逻辑完全通用。
内容的提问来源于stack exchange,提问作者Unknown
相关产品推荐
相关产品推荐

