如何使用 ruamel.yaml 转储对应于列表的更改?

How can I dump changes corresponding to list using ruamel.yaml?

我在 How to auto-dump modified values in nested dictionaries using ruamel.yaml 的相关答案中使用解决方案 RoundTripRepresenter.

如果我对 list 进行更改,ruamel.yaml 可以对局部变量进行更改,但不会 dump/write 将更改写入文件。有可能实现吗?

示例配置文件:

live:
- name: Ethereum
  networks:
  - chainid: 1
    explorer: https://api.etherscan.io/api

例如,我将 name 更改为 alper 并尝试将新项目添加到列表中。

我的代码:

class YamlUpdate:
    def __init__(self):
        self.config_file = Path.home() / "alper.yaml"
        self.network_config = Yaml(self.config_file)
        self.change_item()

    def change_item(self):
        for network in self.network_config["live"]:
            if network["name"] == "Ethereum":
                network["name"] = "alper"
                print(network)
                network.append("new_item")

yy = YamlUpdate()
print(yy.config_file.read_text())

输出是 name 在原始文件上保持不变的地方:

{'name': 'alper', 'networks': [{'chainid': 1, 'explorer': 'https://api.etherscan.io/api'}]}
live:
- name: Ethereum
  networks:
  - chainid: 1
    explorer: https://api.etherscan.io/api

我认为你应该考虑制作一个 class SubConfigList ,它的行为像一个列表,但通知它的 parent (在数据结构中),就像在其他答案中 SubConfig 通知其 parent.

您还需要确保将 SubConfigList 表示为 YAML 文档中的序列。

如果您要在数据结构的根部使用列表,则需要 list-like 替代 dict-like Config。 (或记录您代码的 consumers/users,根始终需要是一个映射)。