【问题标题】:Dump OrderedDict in a more concise way以更简洁的方式转储 OrderedDict
【发布时间】:2019-01-27 12:38:51
【问题描述】:

我的文件中有一个 YAML 文档,我需要使用一些结构化的更新 信息,我从图书馆得到的。转储此信息中的密钥的顺序很重要。

YAML 文件 (input.yaml) 如下所示:

%YAML 1.1
---
- element 1  # this is the first element
- element 2

(请不要问为什么链中的下一个程序只支持 YAML 1.1,尽管 1.2 已经 已经出道九年多了)

我的程序:

import sys
from collections import OrderedDict
from pathlib import Path
import ruamel.yaml

path = Path('input.yaml')

yaml = ruamel.yaml.YAML()  # defaults to round-trip
yaml.version = (1, 1)
yaml.explicit_start = True

data = yaml.load(path)

data.append(
    OrderedDict([
        ('hosts', 'all'), 
        ('vars', {'some_var': True}),
        ('tasks', [
            OrderedDict([('name', 'print some_var'), ('debug', {'var': 'some_var'})])
        ]),
    ]))


yaml.dump(data, sys.stdout)

有输出:

%YAML 1.1
---
- element 1  # this is the first element
- element 2
- !!omap
  - hosts: all
  - vars:
      some_var: true
  - tasks:
    - !!omap
      - name: print some_var
      - debug:
          var: some_var

如何在不获取 !!omap 标签的情况下输出 OrderedDicts 键值作为列表中的单个元素?

  • 我正在使用 ruamel.yaml 来保留现有的 cmets。
  • 我从库中获得了这个结构,但我不能指定它应该使用 ruamel.yaml 的 CommentedMap
  • 我知道如何递归遍历 结构,在附加和转换 OrderedDict 之前 ruamel.yaml 的 CommentedMap,但这太慢了。

【问题讨论】:

  • 这最初是作为对 ruamel.yaml 问题跟踪器上的问题的模糊评论而不恰当地发布的。然后再次作为一个同样不明确和不恰当的“主要提案”。

标签: python yaml ruamel.yaml ordereddict


【解决方案1】:

您可以查找CommentedMap 是如何向RoundTripRepresenter 注册的 并为您的OrderedDicts 使用相同的代码。其实,你只需要多出一行:

yaml.Representer.add_representer(OrderedDict, yaml.Representer.represent_dict)

你的程序给你的:

%YAML 1.1
---
- element 1  # this is the first element
- element 2
- hosts: all
  vars:
    some_var: true
  tasks:
  - name: print some_var
    debug:
      var: some_var

您还可以使用 PyYAML 将表示器附加到聚合 Dumper 结构的方式:

ruamel.yaml.add_representer(OrderedDict, ruamel.yaml.RoundTripDumper.represent_dict, Dumper=ruamel.yaml.RoundTripDumper)

但这更冗长。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-15
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 2019-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多