如何将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
相关产品推荐
相关产品推荐

