我有一个嵌套的类,我想转换和保存为yaml格式使用PyYaml库.得到的YAML输出包含我想删除的YAML标记.

我有以下的Python代码:

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))

它生成YAML输出:

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

如何在不包含YAML标记的情况下生成嵌套数据类的YAML输出?想要的结果应该类似于:

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

推荐答案

当转储Python类的实例时,PyYaml将序列化内容并添加一个指示类的标记,以便允许将YAML输出读回指定的类.PyYaml不会标记像列表和字典这样的原生Python对象,因此通过使用asdict方法将数据类实例转换为字典,YAML转储将不会包含任何标记:

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)
print(yaml.dump(asdict(config)))

上述更新后的代码生成以下输出:

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

Python相关问答推荐

Gekko解算器错误results.json未找到,无法找出原因

将大小为n*512的数组绘制到另一个大小为n*256的数组的PC组件

在Python中添加期货之间的延迟

按日期和组增量计算总价值

PyQt5如何将pyuic 5生成的Python类添加到QStackedWidget中?

Python panda拆分列保持连续多行

从管道将Python应用程序部署到Azure Web应用程序,不包括需求包

Pandas 除以一列中出现的每个值

Python:在类对象内的字典中更改所有键的索引,而不是仅更改一个键

Python在tuple上操作不会通过整个单词匹配

根据在同一数据框中的查找向数据框添加值

ModuleNotFound错误:没有名为flags.State的模块; flags不是包

查找两极rame中组之间的所有差异

Mistral模型为不同的输入文本生成相同的嵌入

Python虚拟环境的轻量级使用

迭代嵌套字典的值

使用groupby方法移除公共子字符串

在嵌套span下的span中擦除信息

为什么'if x is None:pass'比'x is None'单独使用更快?

干燥化与列姆化的比较