簡體   English   中英

為什么 ruamel.yaml 會自動添加錨點和別名?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM