почему руамель.yaml автоматически добавляет якоря и псевдонимы?

#python #anchor #ruamel.yaml

Вопрос:

У меня есть один вопрос о ruamel.yaml, вот мой код, как показано ниже,

 sriov_seg_type = ["flat"] for port in sriov_port:  port_dict = OrderedDict()  port_dict["name"] = port  port_dict["mtu"] = 9000  port_dict["networkType"] = sriov_seg_type  

мой ожидаемый результат таков

 - name: P1  mtu: 9000  networkType:  - flat  - name: P2  mtu: 9000  networkType:  - flat  - name: P3  mtu: 9000  networkType:  - flat  - name: P4  mtu: 9000  networkType:  - flat  

но я получил формат ниже, который содержит привязку и псевдонимы. Как я могу сделать так, чтобы он не создавал привязку и псевдонимы?

 - name: P1  mtu: 9000  networkType: amp;id001  - flat  - name: P2  mtu: 9000  networkType: *id001  - name: P3  mtu: 9000  networkType: *id001  - name: P4  mtu: 9000  networkType: *id001  

Ответ №1:

Псевдонимы-это способ, которым YAML может сбрасывать общие данные, в вашем случае список/последовательность ['flat']

Механизм привязки и псевдонимов необходим для того, чтобы иметь возможность сбрасывать рекурсивные структуры данных, т. Е. те, которые прямо или косвенно являются самореферентными, например:

 data = dict(a=1) data['b'] = data  

Вышесказанное-это то, с чем не могут справиться простые языки сериализации, такие как JSON.

Поскольку у вас просто есть общая структура данных, которая не является самореферентной, вы можете либо назначить копии:

 port_dict["networkType"] = sriov_seg_type.copy()  

или скажите представителю, чтобы он игнорировал псевдонимы:

 import sys import ruamel.yaml from collections import OrderedDict  ruamel.yaml.representer.RoundTripRepresenter.ignore_aliases = lambda x, y: True  yaml = ruamel.yaml.YAML()   data = [] sriov_port = ['P1', 'P2', 'P3', 'P4'] sriov_seg_type = ["flat"] for port in sriov_port:  port_dict = dict()  port_dict["name"] = port  port_dict["mtu"] = 9000  port_dict["networkType"] = sriov_seg_type  data.append(port_dict)  yaml.dump(data, sys.stdout)  

что дает:

 - name: P1  mtu: 9000  networkType:  - flat - name: P2  mtu: 9000  networkType:  - flat - name: P3  mtu: 9000  networkType:  - flat - name: P4  mtu: 9000  networkType:  - flat  

Комментарии:

1. Спасибо за ваш ответ, я действительно ценю это.