#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. Спасибо за ваш ответ, я действительно ценю это.