在 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]
请注意,如果您有自递归数据,您将
必须等待很长时间才能写入文件(取决于
当然取决于你的光盘容量)。
我有一个问题,我希望防止别名出现在我的 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]
请注意,如果您有自递归数据,您将 必须等待很长时间才能写入文件(取决于 当然取决于你的光盘容量)。