在 python 中禁用 yaml 文件的别名

Disabling alias for yaml file in python

我有一个问题,我希望防止别名出现在我的 YAML 文件中。无论如何我可以禁用生成的 YAML 文件中的别名,以实现预期的输出?

我当前的 YAML 文件如下:

agents:
-   start: [0, 0]
    goal: [2, 0]
    name: agent0
-   start: [2, 0]
    goal: [0, 0]
    name: agent1
map:
    dimensions: [3, 3]
    obstacles:
    - !!python/tuple [0, 1]
    - !!python/tuple [2, 1]

当我为每个代理更新 YAML 文件时,只要他们达到目标值到开始的目标点,我就会遇到别名是开始值和目标值的问题,而不是我想要的值,即 [0,0] 表示开始,[0,0] 表示目标。

agents:
- start: &id001 [2, 0]
  goal: *id001
  name: agent0
- start: &id002 [0, 0]
  goal: *id002
  name: agent1
map:
  dimensions: [3, 3]
  obstacles:
  - !!python/tuple [0, 1]
  - !!python/tuple [2, 1]

预期输出:

agents:
- start: [2, 0]
  goal: [2, 0]
  name: agent0
- start: [0, 0]
  goal: [0, 0]
  name: agent1
map:
  dimensions: [3, 3]
  obstacles:
  - !!python/tuple [0, 1]
  - !!python/tuple [2, 1]

我 运行 在 Python 中有以下代码来更新文件:

def updateInput(self, agent):
        yaml = ruamel.yaml.YAML()
        with open('input.yaml') as f:
            doc = yaml.load(f)
            self.get_updated_dict(doc, agent)

        with open('input.yaml', 'w') as y:
            yaml.dump(doc, y)

        return {}
    def get_updated_dict(self, doc, agent):
        obj = doc
        if obj["agents"][0]["name"] == agent:
            goal_state = obj["agents"][0]["goal"]
            obj["agents"][0]["start"] = goal_state   
        return doc

ruamel.yaml 的表示阶段创建别名,但对于每条数据它 使用 ignore_aliases 方法(默认为 False)检查别名是否应该 被那条数据忽略。

在下文中,我取消了所有别名,但您可以根据数据(类型)来设置它 那是代表。 (这只是说明原理,你不必先 使用别名编写 YAML 版本,只需添加行

yaml.representer.ignore_aliases = lambda *data: True

实例化后的任何地方yaml)

import sys
import ruamel.yaml

yaml_str = """\
agents:
- start: &id001 [2, 0]
  goal: *id001
  name: agent0
- start: &id002 [0, 0]
  goal: *id002
  name: agent1
map:
  dimensions: [3, 3]
  obstacles:
  - !!python/tuple [0, 1]
  - !!python/tuple [2, 1]
"""

yaml = ruamel.yaml.YAML()
yaml.representer.ignore_aliases = lambda *data: True
data = yaml.load(yaml_str)
yaml.dump(data, sys.stdout)

给出:

agents:
- start: [2, 0]
  goal: [2, 0]
  name: agent0
- start: [0, 0]
  goal: [0, 0]
  name: agent1
map:
  dimensions: [3, 3]
  obstacles:
  - !!python/tuple [0, 1]
  - !!python/tuple [2, 1]

请注意,如果您有自递归数据,您将 必须等待很长时间才能写入文件(取决于 当然取决于你的光盘容量)。