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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 00:36:25