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

如何将Python嵌套dataclass导出为无标签的YAML?

移除PyYAML序列化嵌套dataclass时的Python对象标签

我用Python的dataclass定义了嵌套结构,想用PyYAML转成纯净的YAML格式,但序列化后输出带!!python/object类标签,需要去掉这些标签得到无结构的YAML。

现有代码:

from dataclasses import dataclass
import yaml


@dataclass
class Database:
    host: str
    username: str
    password: str


@dataclass
class Environment:
    name: str
    database: Database


@dataclass
class Config:
    environment: Environment


database = Database(host="localhost", username="admin", password="secret")
environment = Environment(name="local", database=database)
config = Config(environment=environment)
print(yaml.dump(config))

当前输出:

!!python/object:__main__.Config
environment: !!python/object:__main__.Environment
  database: !!python/object:__main__.Database
    host: localhost
    password: secret
    username: admin
  name: local

期望输出:

environment:
  database:
    host: localhost
    password: secret
    username: admin
  name: local

方法1:转成字典后序列化(最简单)

直接用dataclasses.asdict()把dataclass实例递归转成普通字典,PyYAML序列化字典不会添加Python对象标签:

修改后的代码:

from dataclasses import dataclass, asdict
import yaml


@dataclass
class Database:
    host: str
    username: str
    password: str


@dataclass
class Environment:
    name: str
    database: Database


@dataclass
class Config:
    environment: Environment


database = Database(host="localhost", username="admin", password="secret")
environment = Environment(name="local", database=database)
config = Config(environment=environment)
# 转字典再dump
print(yaml.dump(asdict(config)))

方法2:自定义YAML代表(灵活定制)

如果需要针对特定dataclass做特殊处理(比如忽略某些字段),可以给每个类注册自定义代表,让PyYAML按字典格式序列化:

from dataclasses import dataclass, fields
import yaml


@dataclass
class Database:
    host: str
    username: str
    password: str


@dataclass
class Environment:
    name: str
    database: Database


@dataclass
class Config:
    environment: Environment


# 通用dataclass序列化函数
def dataclass_representer(dumper, obj):
    return dumper.represent_dict({field.name: getattr(obj, field.name) for field in fields(obj)})

# 给每个dataclass注册代表
yaml.add_representer(Database, dataclass_representer)
yaml.add_representer(Environment, dataclass_representer)
yaml.add_representer(Config, dataclass_representer)

database = Database(host="localhost", username="admin", password="secret")
environment = Environment(name="local", database=database)
config = Config(environment=environment)
print(yaml.dump(config))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 13:00:30