如何将 Python 数据类转储到没有标签的 YAML?

How can I dump a Python dataclass to YAML without tags?

提问人:otherJL0 提问时间:10/28/2023 最后编辑:CrazyChuckyotherJL0 更新时间:10/28/2023 访问量:60

问:

我有一个嵌套的数据类,我想使用 PyYaml 库将其转换并保存为 yaml 格式。生成的 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 yaml python-dataclasses pyyaml

评论

2赞 PM 77-1 10/28/2023
作为一个选项,您可以使用 re 替换以空字符串开头的所有内容。!!

答:

2赞 otherJL0 10/28/2023 #1

在转储 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