[英]why the ruamel.yaml automatically add anchors and aliases?
我有一個關於 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: &id001
- flat
- name: P2
mtu: 9000
networkType: *id001
- name: P3
mtu: 9000
networkType: *id001
- name: P4
mtu: 9000
networkType: *id001
別名是 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.