1

ruamel.yaml==0.15.37
Python 3.6.2 :: Continuum Analytics, Inc.

当前代码:

from ruamel.yaml import YAML
import sys


yaml = YAML()
kube_context = yaml.load('''
    apiVersion: v1
    clusters: []
    contexts: []
    current-context: ''
    kind: Config
    preferences: {}
    users: []
''')
kube_context['users'].append({'name': '{username}/{cluster}'.format(username='test', cluster='test'), 'user': {'token': 'test'}})
kube_context['clusters'].append({'name': 'test', 'cluster': {'server': 'URL:443'}})
kube_context['contexts'].append({'name': 'test', 'context': {'user': 'test', 'cluster': 'test'}})

yaml.dump(kube_context, sys.stdout)

yaml.dump()正在生成包含 list 和 dict 对象的输出,而不是完全展开。

电流输出:

apiVersion: v1
clusters: [{name: test, cluster: {server: URL:443}}]
contexts: [{name: test, context: {user: test, cluster: test}}]
current-context: ''
kind: Config
preferences: {}
users: [{name: test/test, user: {token: test}}]

为了使yaml.dump()输出完全扩展,我需要做什么?

预期输出:

apiVersion: v1
clusters: 
  - name: test
    cluster: 
      server: URL:443
contexts: 
  - name: test
    context:
      user: test
      cluster: test
current-context: ''
kind: Config
preferences: {}
users: 
  - name: test/test
    user: 
      token: test
4

2 回答 2

1

输出是“纯” YAML。您希望节点以块样式(基于缩进)而不是当前流样式(基于 []{})呈现。以下是如何做到这一点:

yaml = YAML(typ="safe")
yaml.default_flow_style = False

(注意 Athon 在typ下面的评论;您需要将其设置为safeorunsafe以使 RoundTripLoader 不设置空序列的样式)

于 2018-03-28T16:21:37.443 回答
1

ruamel.yaml,当使用默认值时YAML()YAML(typ='rt')将保留序列和映射的样式。无法使块样式为空序列或空映射,[]因此{}在加载时将其标记为流样式。

流样式只能包含流样式(而块样式可以包含块样式或流样式)(YAML 1.2 规范 8.2.3):

YAML 允许将流节点嵌入到块集合中(反之亦然)。

因此,您在(流式)列表/序列中插入的字典/映射数据也将表示为流式。

如果您希望所有内容都是块样式(您称之为“扩展”模式),您可以通过调用属性.set_block_style()上的方法来显式设置它.fa(仅在集合上可用,因此try/ except):

from ruamel.yaml import YAML
import sys


yaml = YAML()

kube_context = yaml.load('''
    apiVersion: v1
    clusters: []
    contexts: []
    current-context: ''
    kind: Config
    preferences: {}
    users: []
''')
kube_context['users'].append({'name': '{username}/{cluster}'.format(username='test', cluster='test'), 'user': {'token': 'test'}})
kube_context['clusters'].append({'name': 'test', 'cluster': {'server': 'URL:443'}})
kube_context['contexts'].append({'name': 'test', 'context': {'user': 'test', 'cluster': 'test'}})

for k in kube_context:
    try:
        kube_context[k].fa.set_block_style()
    except AttributeError:
        pass

yaml.dump(kube_context, sys.stdout)

这给出了:

apiVersion: v1
clusters:
- name: test
  cluster:
    server: URL:443
contexts:
- name: test
  context:
    user: test
    cluster: test
current-context: ''
kind: Config
preferences: {}
users:
- name: test/test
  user:
    token: test

请注意,不需要设置yaml.default_flow_style = False为默认的往返模式;并且虽然已经为 key 的值设置了块样式preferences,但它表示的是流样式,因为没有其他方法可以表示空映射。

于 2018-03-28T17:02:43.167 回答