如何在ruamel yaml中定义新词典的样式?

尤金·沃洛丁

问题是在Python中往返转储YAML时是否有保留顺序的方法?解决后,正确导入了数据结构,正确设置了样式属性,等等。我编写了一些代码来插入嵌套的CommentedMap()字典(sw-99-54321),其中包含一些字典和列表,例如:

  dc01:
    sw-06-50001:  # existing entry
      servers:
      - {ip: 10.255.206.12, port: 50001, weight: 100}
      - {ip: 10.255.206.13, port: 50001, weight: 90}
      virtual: {ip: 192.168.1.4, port: 50001}

    sw-99-54321:  # the entry I am trying to add   
      servers:
      - ip: 192.168.1.1
        port: '65535'
        weight: 100
      - ip: 192.168.1.2
        port: '65534'
        weight: 90
      virtual:
        ip: 192.168.1.1
        port: 65532

我想以与“ sw-06-50001”相同的方式来格式化“ sw-99-54321”。

我知道样式绑定到<var>.fa.__flow_style属性,但是我不能直接更改它:

data['services']['dc01']['sw-99-54321']['servers'].fa.set_flow_style='True'
Traceback (most recent call last):
  File "<input>", line 1, in <module>
AttributeError: 'Format' object attribute 'set_flow_style' is read-only 

是否可以设置它,或以其他方式为某些元素定义块样式?

安通

由于您的示例具有流样式,因此您可以做两件事

1)明确设置流样式:

import sys
import ruamel.yaml

yaml_str = """\
dc01:
  sw-06-50001:  #existed entry
    servers:
    - {ip: 10.255.206.12, port: 50001, weight: 100}
    - {ip: 10.255.206.13, port: 50001, weight: 90}
    virtual: {ip: 192.168.1.4, port: 50001}
"""

yaml = ruamel.yaml.YAML()
# yaml.indent(mapping=4, sequence=4, offset=2)
# yaml.preserve_quotes = True
data = yaml.load(yaml_str)
data['dc01']['sw-99-54321'] = n = {}
n['servers'] = l = []
l.append(ruamel.yaml.comments.CommentedMap([('ip', '192.168.1.1'), ('port', '65535'), ('weight', 100)]))
l[-1].fa.set_flow_style()
l.append(ruamel.yaml.comments.CommentedMap([('ip', '192.168.1.2'), ('port', '65534'), ('weight', 90)]))
l[-1].fa.set_flow_style()
n['virtual'] = x = ruamel.yaml.comments.CommentedMap([('ip', '192.168.1.1'), ('port', '65532')])
x.fa.set_flow_style()

yaml.dump(data, sys.stdout)

这使:

dc01:
  sw-06-50001:  #existed entry
    servers:
    - {ip: 10.255.206.12, port: 50001, weight: 100}
    - {ip: 10.255.206.13, port: 50001, weight: 90}
    virtual: {ip: 192.168.1.4, port: 50001}
  sw-99-54321:
    servers:
    - {ip: 192.168.1.1, port: '65535', weight: 100}
    - {ip: 192.168.1.2, port: '65534', weight: 90}
    virtual: {ip: 192.168.1.1, port: '65532'}

2)将所有叶节点设置为全局流样式:

import sys
import ruamel.yaml

yaml_str = """\
dc01:
  sw-06-50001:  #existed entry
    servers:
    - {ip: 10.255.206.12, port: 50001, weight: 100}
    - {ip: 10.255.206.13, port: 50001, weight: 90}
    virtual: {ip: 192.168.1.4, port: 50001}
"""

yaml = ruamel.yaml.YAML()
yaml.default_flow_style = None

data = yaml.load(yaml_str)
data['dc01']['sw-99-54321'] = n = ruamel.yaml.comments.CommentedMap()
n['servers'] = l = []
l.append(ruamel.yaml.comments.CommentedMap([('ip', '192.168.1.1'), ('port', '65535'), ('weight', 100)]))
l.append(dict(ip='192.168.1.2', port='65534', weight=90))
n['virtual'] = ruamel.yaml.comments.CommentedMap([('ip', '192.168.1.1'), ('port', '65532')])

yaml.dump(data, sys.stdout)

这使:

dc01:
  sw-06-50001:  #existed entry
    servers:
    - {ip: 10.255.206.12, port: 50001, weight: 100}
    - {ip: 10.255.206.13, port: 50001, weight: 90}
    virtual: {ip: 192.168.1.4, port: 50001}
  sw-99-54321:
    servers:
    - {ip: 192.168.1.1, port: '65535', weight: 100}
    - {ip: 192.168.1.2, port: '65534', weight: 90}
    virtual: {ip: 192.168.1.1, port: '65532'}

使用此方法,无需创建CommentedMap()实例,可以使用常规命令

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如果一个词典中的键与另一本词典中的键匹配,如何返回新词典?

如何配置ruamel.yaml.dump输出?

如何使用ruamel.yaml在Python中向YAML插入注释行?

如何快速比较两个词典,然后将相似之处附加到新词典中?

如何使用ruamel.yaml正确缩进序列?

如何使用其他词典列表更新词典列表?

如何使用ruamel.yaml注释掉YAML部分?

如何使用ruamel.yaml添加评论

如何在ruamel.yaml中显式编写两个引用

如何在不破坏ruamel.yaml中的锚的情况下更改序列中的锚标量?

如何在无需创建新词典的情况下更新词典?

如何在新词典中添加对?[字典],然后将相同键的值求和

如何在Racket中的自定义词典上创建词典映射?

从词典列表中创建新词典

如何在ruamel.yaml中更改要锚定的属性引用之一

如何遍历词典列表并创建新词典

如何在嵌套词典的最深层插入新词典?

如何使用ruamel.yaml来正确设置YAML流样式转储?

如何使用python和ruamel更新此Yaml文件?

将Python列表显示为块样式yaml文件(ruamel.yaml)中的流样式

如何在python中创建自定义词典?

如何使用ruamel.yaml添加节点

如何离线安装 ruamel.yaml python 库?

在 ruamel.yaml 中使用自定义构造函数时如何避免全局状态?

如何使用 ruamel.yaml 读/写 Markdown yaml frontmatter?

如何替换 ruamel.yaml 中的 NoneType 代表

如何使用 ruamel.yaml 读取多个 yaml 定义

如何使用 ruamel.yaml 在 YAML 中插入换行符?

如何使用 ruamel.yaml 向 YAML 文件添加内容?